পাইথনের একটি আপেক্ষিক স্থানে ফাইল খুলুন


132

ধরা যাক, পাইথন কোডটি পূর্বের উইন্ডোজ ডিরেক্টরি দ্বারা 'মাইন' বলে জানা না গিয়ে নির্বাহ করা হয়েছে এবং কোড চালিত হওয়ার সাথেই যেখানেই ইনস্টল করা আছে সেখানে 'মেইন / 2091 / ডেটা.টিএসটিএস্ট' ডিরেক্টরিতে অ্যাক্সেস করা দরকার।

আমি কীভাবে খোলা (অবস্থান) ফাংশন ব্যবহার করব? অবস্থান কি হওয়া উচিত?

সম্পাদনা করুন:

আমি দেখতে পেয়েছি যে নীচের সরল কোডটি কাজ করবে..এর কোনও অসুবিধা আছে কি?

    file="\2091\sample.txt"
    path=os.getcwd()+file
    fp=open(path,'r+');

1
আপনি অনস্কেপড ব্যাকস্ল্যাশ ব্যবহার করছেন। এটি একটি অসুবিধা।
অরিপ

6
বিভিন্ন অসুবিধা। 1) @ ওরিপ অনুসারে, এমনকি উইন্ডোতেও পাথের জন্য ফরোয়ার্ড স্ল্যাশ ব্যবহার করুন। আপনার স্ট্রিং কাজ করবে না। বা কাঁচা স্ট্রিং ব্যবহার করুন r"\2091\sample.txt"। অথবা তাদের মতো পালিয়ে যান "\\2091\\sample.txt"(তবে এটি বিরক্তিকর)। এছাড়াও, 2) আপনি getcwd () ব্যবহার করছেন যা আপনি স্ক্রিপ্টটি কার্যকর করার সময় যে পথে ছিলেন। আমি ভেবেছিলাম আপনি স্ক্রিপ্টের অবস্থানের তুলনায় চেয়েছিলেন (তবে এখন ভাবছি)। এবং 3), সর্বদা os.pathপাথ পরিচালনা করার জন্য ফাংশন ব্যবহার করুন। আপনার পাথ যোগদানের লাইনটি os.path.join(os.getcwd(), file)4) হওয়া উচিত ; অর্থহীন
রাশ

3
আর ভাল পরিমাপ জন্য ... 5) ব্যবহারের প্রসঙ্গ রক্ষীদের এটা পরিষ্কার রাখতে হবে এবং আপনার ফাইল বন্ধ করতে ভুলে এড়াতে: with open(path, 'r+') as fp:। আমি যে বিবৃতিগুলি দেখেছি তার সর্বোত্তম ব্যাখ্যার জন্য এখানে দেখুন with
রাশ

স্ল্যাশগুলিতে প্রয়োজনীয় যত্নের পাশাপাশি, যেমনটি ইঙ্গিত করা হয়েছে, os.path.abspathআপেক্ষিক পথটি খোলার জন্য সহজেই পুরো পথটি পেতে ফাংশন রয়েছে । চূড়ান্ত বিবৃতিটি এর মতো দেখাচ্ছে:os.path.abspath('./2091/sample.txt')
ওপেন্ডেন্ডেভোর

উত্তর:


189

এই ধরণের জিনিসটির সাথে আপনার প্রকৃত কার্যকরী ডিরেক্টরি কী তা সতর্ক হওয়া উচিত। উদাহরণস্বরূপ, আপনি যে ডিরেক্টরিটি ফাইলটিতে আছেন সেখান থেকে আপনি স্ক্রিপ্টটি চালাবেন না this এই ক্ষেত্রে, আপনি কেবল নিজের দ্বারা কোনও আপেক্ষিক পথ ব্যবহার করতে পারবেন না।

আপনি যদি নিশ্চিত হন যে ফাইলটি আপনি চান সেখানে স্ক্রিপ্টটি আসলে নীচে একটি উপ-ডিরেক্টরিতে রয়েছে তবে __file__আপনি এখানে সহায়তা করতে ব্যবহার করতে পারেন। __file__আপনি যে স্ক্রিপ্টটি চালাচ্ছেন সেখানে যাওয়ার পুরো পথ।

সুতরাং আপনি এই জাতীয় কিছু দিয়ে ঝাঁকুনি করতে পারেন:

import os
script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

আমি দেখতে পেয়েছি যে নীচের সরল কোডটি কাজ করবে..এর কোনও অসুবিধা আছে কি? <pre> ফাইল = "\ নমুনা। টেক্সট" পাথ = os.getcwd () + স্ট্র (লোকেশন) + ফাইল এফপি = খোলা (পথ, 'আর +'); <কোড>

@ আর্যাশ এর অসুবিধাটি সিডব্লিউড (বর্তমান ওয়ার্কিং ডিরেক্টরি) যে কোনও কিছু হতে পারে এবং আপনার স্ক্রিপ্টটি কোথায় অবস্থিত তা অগত্যা হবে না।
কোরি মাওয়াহোটার 21

5
__file__একটি আপেক্ষিক পথ (কমপক্ষে কোনও কারণে আমার সেটআপে), এবং আপনাকে os.path.abspath(__file__)প্রথমে কল করতে হবে । osx / homebrew 2.7
কোরি মাওয়াহোটার

2
os.path.dirname ( ফাইল ) পাইথন ২.7 এ আমার জন্য কাজ করছে না। এটি প্রদর্শিত হচ্ছেNameError: name '__file__' is not defined
সৌমেন্দ্র

1
@ সৌমেন্দ্র আমার ধারণা আপনি কনসোলে এটি চেষ্টা করে দেখছেন। এটি একটি * .py ফাইলে চেষ্টা করে দেখুন।
এনকু

35

এই কোডটি সূক্ষ্মভাবে কাজ করে:

import os


def readFile(filename):
    filehandle = open(filename)
    print filehandle.read()
    filehandle.close()



fileDir = os.path.dirname(os.path.realpath('__file__'))
print fileDir

#For accessing the file in the same folder
filename = "same.txt"
readFile(filename)

#For accessing the file in a folder contained in the current folder
filename = os.path.join(fileDir, 'Folder1.1/same.txt')
readFile(filename)

#For accessing the file in the parent folder of the current folder
filename = os.path.join(fileDir, '../same.txt')
readFile(filename)

#For accessing the file inside a sibling folder.
filename = os.path.join(fileDir, '../Folder2/same.txt')
filename = os.path.abspath(os.path.realpath(filename))
print filename
readFile(filename)

আমার জন্য বর্তমান ফোল্ডারের প্যারেন্ট ফোল্ডারে ফাইল অ্যাক্সেস করা কাজ করেনি .. এটি স্ট্রিং হিসাবে যুক্ত করা হয়েছে ..
এম পল

উইন্ডোজে কাজ করেনি। ফাইলে যাওয়ার পথটি সঠিক তবে পাইথন "ফাইল খুঁজে পাওয়া যায় নি" বলে এবং \\ বিভাজকগুলির সাথে পথ দেখায়।
দীর্ঘতম

26

আমি একটি অ্যাকাউন্ট তৈরি করেছি যাতে আমি রাশিয়ার মূল প্রতিক্রিয়ার মধ্যে খুঁজে পেয়েছি বলে মনে করি কোনও তাত্পর্য পরিষ্কার করতে পারি।

রেফারেন্সের জন্য, তাঁর আসল উত্তরটি ছিল:

import os
script_dir = os.path.dirname(__file__)
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

এটি দুর্দান্ত উত্তর কারণ এটি গতিশীলভাবে কাঙ্ক্ষিত ফাইলটিতে একটি পরম সিস্টেমের পথ তৈরি করার চেষ্টা করছে is

কোরি মাওহওয়ার্টর লক্ষ্য করেছেন যে __file__এটি একটি আপেক্ষিক পথ (এটি আমার সিস্টেমেও রয়েছে) এবং ব্যবহারের পরামর্শ দিয়েছেন os.path.abspath(__file__)os.path.abspathতবে, আপনার বর্তমান স্ক্রিপ্টের নিখুঁত পাথ (যেমন /path/to/dir/foobar.py) ফেরায়

এই পদ্ধতিটি ব্যবহার করার জন্য (এবং কীভাবে আমি শেষ পর্যন্ত এটি কাজ করে চলেছি) আপনাকে পথের শেষ থেকে স্ক্রিপ্টের নামটি সরিয়ে ফেলতে হবে:

import os
script_path = os.path.abspath(__file__) # i.e. /path/to/dir/foobar.py
script_dir = os.path.split(script_path)[0] #i.e. /path/to/dir/
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

ফলস্বরূপ abs_file_path (এই উদাহরণে) হয়ে যায়: /path/to/dir/2091/data.txt


14
আপনি এমনকি সহজ জন্য উভয় পদ্ধতির একত্রিত করতে পারেos.path.dirname(os.path.abspath(__file__))
লুক টেলর

1
@ লুকিয়েটেলার আসলে os.path.dirnameগত বছর আমার উত্তরে আমি যেমন কার্যকারিতাটি প্রতিলিপি দেওয়ার চেষ্টা করাই তার চেয়ে ভাল হবে be
অনুদান হুলেগার্ড

19

এটি নির্ভর করে আপনি কোন অপারেটিং সিস্টেমটি ব্যবহার করছেন। আপনি যদি এমন কোনও সমাধান চান যা উইন্ডোজ এবং * নিক্স উভয়ের সাথে সামঞ্জস্যপূর্ণ যেমন:

from os import path

file_path = path.relpath("2091/data.txt")
with open(file_path) as f:
    <do stuff>

ভাল কাজ করা উচিত।

pathমডিউল যাই হোক না কেন অপারেটিং সিস্টেম এর উপর চালাচ্ছে জন্য একটি পাথ ফরম্যাট করতে সক্ষম হয়। এছাড়াও, পাইথন আপেক্ষিক পাথগুলি ঠিকঠাকভাবে পরিচালনা করে, যতক্ষণ আপনার কাছে সঠিক অনুমতি থাকে।

সম্পাদনা করুন :

মন্তব্যে কিন্ডাল দ্বারা উল্লিখিত হিসাবে, পাইথন যেভাবেই হোক ইউনিক্স-স্টাইল এবং উইন্ডোজ-শৈলীর পাথগুলির মধ্যে রূপান্তর করতে পারে, তাই আরও সহজ কোডও কাজ করবে:

with open("2091/data/txt") as f:
    <do stuff>

বলা হচ্ছে, pathমডিউলটির এখনও কিছু কার্যকর ফাংশন রয়েছে।


3
relpath()একটি পাথের নামকে আপেক্ষিক পথে রূপান্তর করে। যেহেতু এটি ইতিমধ্যে একটি আপেক্ষিক পথ, এটি কিছুই করবে না।
পাঠান

এটি যথাযথ হলে এটি ইউনিক্স-শৈলীর পাথ থেকে উইন্ডোজ-স্টাইলের পথে রূপান্তর করবে। os.pathমডিউলটিতে আরও একটি ফাংশন রয়েছে যা আরও ভাল পছন্দ হবে?
ওয়াইল্ডক

1
উইন্ডোজ ইতিমধ্যে ইউএনআইএক্স-স্টাইলের পাথের সাথে দুর্দান্ত কাজ করবে। কমপক্ষে এনটি-ভিত্তিক সিরিজ হবে (2000, এক্সপি, ভিস্তা, 7)। কোনও রূপান্তর প্রয়োজনীয় নয়।
kindall

7
এই উত্তরটি বেশ সঠিক নয় এবং সমস্যা তৈরি করবে। আপেক্ষিক পাথগুলি ডিফল্টরূপে বর্তমান কার্যনির্বাহী ডিরেক্টরি সম্পর্কিত (স্ক্রিপ্টটি যেখান থেকে চালানো হয়েছিল) এবং প্রকৃত স্ক্রিপ্টের অবস্থান নয়। আপনার ব্যবহার করা দরকার __file__। আমার উত্তর দেখুন দয়া করে।
রাশ

এই উত্তরের লেখক কী os.path.relpath কে os.path.abspath গুলিয়ে ফেললেন?
foobarbecue

15

আমার কোড উইন্ডোজ সিস্টেমে পাইথন 3 চালিত ফাইলটি কেন খুঁজে পেল না তা আবিষ্কার করতে আমি অনেক সময় ব্যয় করি। তাই আমি যোগ। আগে / এবং সবকিছু ঠিকঠাক কাজ করেছে:

import os

script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, './output03.txt')
print(file_path)
fptr = open(file_path, 'w')

আরও ভাল:file_path = os.path.join(script_dir, 'output03.txt')
মিস্টার_আর_আমস_ডি

আমি উইন্ডোজ ওএসে চেষ্টা করেছি কিন্তু আমার সাফল্য হয়নি।
অ্যাঞ্জেলো পোলোটো

আকর্ষণীয় - আপনি কি স্ক্রিপ্ট_ডির প্রিন্ট করতে পারবেন? তারপরে এটিকে নিখুঁত পথে পরিণত করুনscript_dir = os.path.abspath(os.path.dirname(__file__))
Mr_and_Mrs_D

আমি চেষ্টা করব, আমি সফল হলে আমি উত্তরটি পরিবর্তন করব।
অ্যাঞ্জেলো পোলোটো

6

কোড:

import os
script_path = os.path.abspath(__file__) 
path_list = script_path.split(os.sep)
script_directory = path_list[0:len(path_list)-1]
rel_path = "main/2091/data.txt"
path = "/".join(script_directory) + "/" + rel_path

ব্যাখ্যা:

আমদানি পাঠাগার:

import os

__file__বর্তমান স্ক্রিপ্টের পথ অর্জন করতে ব্যবহার করুন :

script_path = os.path.abspath(__file__)

স্ক্রিপ্টের পথটিকে একাধিক আইটেমগুলিতে পৃথক করে:

path_list = script_path.split(os.sep)

তালিকার শেষ আইটেমটি সরান (প্রকৃত স্ক্রিপ্ট ফাইল):

script_directory = path_list[0:len(path_list)-1]

আপেক্ষিক ফাইলের পথ যুক্ত করুন:

rel_path = "main/2091/data.txt

তালিকা আইটেমগুলিতে যোগদান করুন এবং আপেক্ষিক পথের ফাইল যুক্ত করুন:

path = "/".join(script_directory) + "/" + rel_path

এখন আপনি ফাইলটি দিয়ে যা কিছু করতে চান তা যেমন উদাহরণস্বরূপ:

file = open(path)

পরিবর্তে path = "/".join(script_directory) + "/" + rel_pathআপনার হিসাবে ওএস মডিউলটি ব্যবহার করা উচিত path = os.path.join(script_directory, rel_path)। আপনার যে পথটি ব্যবহার করা উচিত তা ম্যানুয়ালি পার্স করার পরিবর্তেscript_path = os.path.dirname(__file__)
Mr_and_Mrs_D

3

যদি ফাইলটি আপনার মূল ফোল্ডারে থাকে তবে যেমন eg follower.txt, আপনি সহজভাবে ব্যবহার করতে পারেনopen('../follower.txt', 'r').read()


3

এটা চেষ্টা কর:

from pathlib import Path

data_folder = Path("/relative/path")
file_to_open = data_folder / "file.pdf"

f = open(file_to_open)

print(f.read())

পাইথন ৩.৪ ফাইল এবং পাথলিব নামক পাথগুলি নিয়ে কাজ করার জন্য একটি নতুন স্ট্যান্ডার্ড লাইব্রেরি চালু করেছে। এটা আমার জন্য কাজ করে!


2

নিশ্চিত না যে এটি সর্বত্র কাজ করে।

আমি উবুন্টুতে আইপিথন ব্যবহার করছি।

আপনি যদি বর্তমান ফোল্ডারের সাব-ডিরেক্টরিতে ফাইলটি পড়তে চান:

/current-folder/sub-directory/data.csv

আপনার স্ক্রিপ্টটি বর্তমান ফোল্ডারে রয়েছে কেবল এটি চেষ্টা করুন:

import pandas as pd
path = './sub-directory/data.csv'
pd.read_csv(path)

1

পাইথন কেবলমাত্র অপারেটিং সিস্টেমে যে ফাইল ফাইলটি দেয় তা দিয়ে দেয় op যদি আপনার অপারেটিং সিস্টেমটি main/2091/data.txt(ইঙ্গিত: এটি করে) এর মতো আপেক্ষিক পাথগুলিকে সমর্থন করে তবে তা কার্যকর হবে।

আপনি দেখতে পাচ্ছেন যে এই জাতীয় প্রশ্নের উত্তর দেওয়ার সবচেয়ে সহজ উপায়টি চেষ্টা করে দেখুন কী ঘটে see


2
সত্য নয় ... স্ক্রিপ্টের অভ্যন্তরীণ ডিরেক্টরিটি হ'ল অবস্থানটি আপনি স্ক্রিপ্টটি চালান, স্ক্রিপ্টের অবস্থান নয় । আপনি অন্য কোথাও থেকে স্ক্রিপ্টটি চালনা করলে (সম্ভবত স্ক্রিপ্টটি আপনার সিস্টেমের পথে রয়েছে) সাব-ডিরেক্টরিতে আপেক্ষিক পাথ কাজ করবে না। এটি কীভাবে পেতে পারে সে সম্পর্কে আমার উত্তরটি দেখুন।
রাশ

@ রুশ - ওপির উদাহরণ ব্যবহার করে getcwd()। আমি মূল বিবরণটি "কোডটি যেখানে বসে সেখানে নির্বিশেষে যেখানে স্ক্রিপ্টটি চালিত করি তার সাথে সম্পর্কিত" হিসাবে পড়েছি।
অরিপ

@ ইউরিপ - ওপিতে প্রশ্নের পরে getcwd () কল 3 ঘন্টা যুক্ত করেছে। কিছু নয় ... এগিয়ে চলছে। :)
রাশ

1
import os
def file_path(relative_path):
    dir = os.path.dirname(os.path.abspath(__file__))
    split_path = relative_path.split("/")
    new_path = os.path.join(dir, *split_path)
    return new_path

with open(file_path("2091/data.txt"), "w") as f:
    f.write("Powerful you have become.")

0

আমি যখন শিক্ষানবিশ ছিলাম তখন এই বিবরণগুলি কিছুটা ভয় পেয়েছিলাম। প্রথম হিসাবে আমি চেষ্টা করব For Windows

f= open('C:\Users\chidu\Desktop\Skipper New\Special_Note.txt','w+')
print(f) 

এবং এটি একটি বাড়াতে হবে syntax error। আমি খুব বিভ্রান্ত পেতে ব্যবহার। তারপরে গুগল জুড়ে কিছু সার্ফিংয়ের পরে। ত্রুটিটি কেন ঘটেছে তা খুঁজে পেয়েছি। নতুনদের জন্য এটি লেখা

এর কারণ ইউনিকোডে পড়ার জন্য \ফাইলের পথ শুরু করার সময় আপনি সাধারণ অ্যাড করুন

f= open('C:\\Users\chidu\Desktop\Skipper New\Special_Note.txt','w+')
print(f)

এবং এখন এটি \ডিরেক্টরি শুরু করার আগে যুক্ত করার কাজ করে।


1
ব্যাকস্ল্যাশগুলি কয়েকটি চরিত্রের জন্য পালানোর অক্ষর। \tউদাহরণস্বরূপ আপনি যদি মুখোমুখি \top\directoryহয়ে থাকেন তবে '' t 'কে ট্যাব-চরিত্র হিসাবে ব্যাখ্যা করা হয় এবং আপনার' কৌশল 'ব্যর্থ হয়। সর্বোত্তম বিকল্পটি কাঁচা স্ট্রিং বিন্যাসটি ব্যবহার করা r'C:\Users\chidu\Desktop\Skipper New\Special_Note.txt'যা অক্ষরগুলি 'পালাতে' চেষ্টা করে না।
রোনাল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.