पायथन में एक सापेक्ष स्थान में फ़ाइल खोलें


132

मान लीजिए कि पायथन कोड को पहले से नहीं जाना जाता है, जिसे मुख्य निर्देशिका 'मुख्य' कहती है, और जहां भी कोड स्थापित होता है, उसे 'मुख्य / 2091 / data.txt' निर्देशिका तक पहुंचने की आवश्यकता होती है।

मुझे खुले (स्थान) फ़ंक्शन का उपयोग कैसे करना चाहिए? स्थान क्या होना चाहिए?

संपादित करें:

मैंने पाया कि नीचे सरल कोड काम करेगा..क्या इसका कोई नुकसान है?

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

1
आप बिना बैकस्लैश का उपयोग कर रहे हैं। यह एक नुकसान है।
orip

6
कई नुकसान। 1) @orip के अनुसार, पथ के लिए आगे की स्लैश का उपयोग करें, यहां तक ​​कि खिड़कियों पर भी। आपका तार काम नहीं करेगा। या जैसे कच्चे तार का उपयोग करें r"\2091\sample.txt"। या उनकी तरह बच "\\2091\\sample.txt"(लेकिन यह कष्टप्रद है)। इसके अलावा, 2) आप getcwd () का उपयोग कर रहे हैं, जो पथ है जब आप स्क्रिप्ट निष्पादित करते हैं। मुझे लगा कि आप स्क्रिप्ट स्थान के सापेक्ष चाहते हैं (लेकिन अब सोच रहे हैं)। और 3), हमेशा os.pathपथों में हेरफेर करने के लिए कार्यों का उपयोग करें । आपका पथ जुड़ने की रेखा os.path.join(os.getcwd(), file)4 होनी चाहिए ); व्यर्थ है
Russ

3
और अच्छे उपाय के लिए ... 5) इसे साफ रखने और अपनी फाइल को बंद करने से बचने के लिए संदर्भ गार्ड का उपयोग करें with open(path, 'r+') as fp::। मैंने देखा है कि बयानों की सबसे अच्छी व्याख्या के लिए यहां देखें with
रसेल

स्लैश पर आवश्यक देखभाल के बगल में, जैसा कि बस संकेत दिया गया है, os.path.abspathखोलने के लिए सापेक्ष पथ का पूरा रास्ता आसानी से प्राप्त करने का कार्य है। अंतिम विवरण इस तरह दिखता है:os.path.abspath('./2091/sample.txt')
OPMendeavor

जवाबों:


189

इस प्रकार की चीजों से आपको सावधान रहने की जरूरत है कि आपकी वास्तविक कार्य निर्देशिका क्या है। उदाहरण के लिए, आप स्क्रिप्ट को उस निर्देशिका से नहीं चला सकते हैं जो फ़ाइल में है। इस मामले में, आप केवल एक सापेक्ष पथ का उपयोग नहीं कर सकते।

यदि आपको यकीन है कि आप जो फ़ाइल चाहते हैं, वह नीचे एक उपनिर्देशिका में है जहां स्क्रिप्ट वास्तव में स्थित है, तो __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> फ़ाइल = "\ sample.txt" पथ = os.getcwd () + str (स्थान) + फ़ाइल fp = खुला (पथ, 'r +'); <कोड>

@ क्रैश उस के लिए नुकसान है cwd (वर्तमान कार्यशील निर्देशिका) कुछ भी हो सकता है, और जरूरी नहीं कि आपकी स्क्रिप्ट स्थित हो।
कोरी म्हॉटर जुले

5
__file__एक सापेक्ष पथ है (कम से कम मेरे सेटअप पर, किसी कारण से), और आपको os.path.abspath(__file__)पहले कॉल करने की आवश्यकता है ।
ऑक्स

2
os.path.dirname ( फ़ाइल ) मेरे लिए पायथन 2.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)

यह एक महान जवाब है क्योंकि यह वांछित फ़ाइल के लिए एक निरपेक्ष प्रणाली पथ को गतिशील रूप से बनाने की कोशिश कर रहा है।

Cory Mawhorter ने देखा कि __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
@LukeTaylor वास्तव में os.path.dirnameकार्यक्षमता को दोहराने की कोशिश करने से बेहतर होगा कि जैसा कि मैंने पिछले साल अपने उत्तर में किया था।
ग्रांट हुलगार्ड

19

यह निर्भर करता है कि आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं। यदि आप ऐसा समाधान चाहते हैं जो Windows और * nix दोनों के साथ संगत हो, तो:

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()एक पथनाम को एक सापेक्ष पथ में परिवर्तित करता है। चूंकि यह पहले से ही एक सापेक्ष पथ है, यह कुछ भी नहीं करेगा।
kindall

यदि यह उपयुक्त है तो यह यूनिक्स-शैली पथ से विंडोज़-शैली पथ में परिवर्तित हो जाएगा। क्या os.pathमॉड्यूल में एक और कार्य है जो एक बेहतर विकल्प होगा?
वाइल्डक

1
Windows पहले से ही UNIX- शैली पथ के साथ ठीक काम करेगा। कम से कम NT- आधारित श्रृंखला (2000, XP, विस्टा, 7) होगी। कोई रूपांतरण आवश्यक नहीं है।
kindall

7
यह उत्तर बिल्कुल सही नहीं है और इससे समस्याएं पैदा होंगी। वर्तमान कार्य निर्देशिका (सापेक्ष स्क्रिप्ट जिस पथ से निष्पादित की गई थी) से सापेक्ष पथ डिफ़ॉल्ट रूप से होते हैं, और वास्तविक स्क्रिप्ट स्थान नहीं। आपको उपयोग करने की आवश्यकता है __file__। कृपया मेरा उत्तर देखें।
रोस

क्या इस उत्तर के लेखक ने os.path.relpath को os.path.abspath के साथ भ्रमित किया?
फोब्बरबेक्यू

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')
Mr_and_Mrs_D

मैंने विंडोज ओएस पर कोशिश की, लेकिन मुझे सफलता नहीं मिली।
13

रुचिकर - क्या आप script_dir प्रिंट कर सकते हैं? फिर इसे पूर्ण पथ में बदल देंscript_dir = os.path.abspath(os.path.dirname(__file__))
Mr_and_Mrs_D

मैं कोशिश करूंगा कि, अगर मैं सफल रहा तो जवाब बदल दूंगा।
16ngelo Polotto

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

यदि फ़ाइल आपके मूल फ़ोल्डर में है, उदाहरण के लिए। 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())

पायथन 3.4 ने पथलिब नामक फाइलों और रास्तों से निपटने के लिए एक नया मानक पुस्तकालय शुरू किया। इससे मेरा काम बनता है!


2

यकीन नहीं तो हर जगह यह काम।

मैं ubuntu में ipython का उपयोग कर रहा हूँ।

यदि आप वर्तमान फ़ोल्डर की उप-निर्देशिका में फ़ाइल पढ़ना चाहते हैं:

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

आपकी स्क्रिप्ट वर्तमान-फ़ोल्डर में है बस इसे आज़माएं:

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

1

पायथन सिर्फ उस फ़ाइलनाम को पास करता है जिसे आप ऑपरेटिंग सिस्टम को देते हैं, जो इसे खोलता है। यदि आपका ऑपरेटिंग सिस्टम जैसे रिश्तेदार रास्तों का समर्थन करता हैmain/2091/data.txt (संकेत: यह करता है), तो वह ठीक काम करेगा।

आपको लग सकता है कि इस तरह के प्रश्न का उत्तर देने का सबसे आसान तरीका यह है कि आप इसे देखें और देखें कि क्या होता है।


2
सच नहीं है ... एक स्क्रिप्ट के अंदर काम करने वाली निर्देशिका वह स्थान है जहां से आपने स्क्रिप्ट को चलाया था, स्क्रिप्ट के स्थान को नहीं । यदि आप स्क्रिप्ट को कहीं और से चलाते हैं (हो सकता है कि स्क्रिप्ट आपके सिस्टम पथ में है) तो उपनिर्देशिका के सापेक्ष पथ काम नहीं करेगा। कृपया मेरा उत्तर देखें कि इसे कैसे प्राप्त करें।
रोस

@Russ - ओपी का उदाहरण उपयोग करता है getcwd()। मैंने मूल विवरण को "जहां मैं स्क्रिप्ट चलाता हूं, जहां कोड बैठता है" के सापेक्ष मूल विवरण पढ़ा।
orip

@orip - ओपी ने सवाल के बाद getcwd () कॉल 3 बजे जोड़ा। कोई बात नहीं ... चल रहा है। :)
Russ

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'जो पात्रों से बचने की कोशिश नहीं करता है।
रोनाल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.