पायथन में एक निरपेक्ष फ़ाइल पथ कैसे प्राप्त करें


723

इस तरह के एक पथ को देखते हुए "mydir/myfile.txt", मैं पायथन में वर्तमान कार्य निर्देशिका के सापेक्ष फ़ाइल के निरपेक्ष पथ को कैसे खोज सकता हूं? जैसे कि विंडोज पर, मैं इसके साथ समाप्त हो सकता हूं:

"C:/example/cwd/mydir/myfile.txt"

2
इसी तरह के सवाल: stackoverflow.com/questions/7165749/…
राज

जवाबों:


1054
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

यह भी काम करता है अगर यह पहले से ही एक पूर्ण मार्ग है:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

29
नोट: अधिकांश प्लेटफार्मों पर, यह फ़ंक्शन normpath()को निम्नानुसार कॉल करने के बराबर है normpath(join(os.getcwd(), path)):। इसलिए यदि mydir/myfile.txtनहीं os.getcwd(), तो पूर्ण मार्ग वास्तविक मार्ग नहीं है
कुन्नूर

32
@ तानोर? स्पष्ट जड़ के बिना, mydir/myfile.txtवर्तमान कार्य निर्देशिका के अंदर एक मार्ग को संदर्भित करता है, इसलिए इसके बराबर है ./mydir/myfile.txt। यह वह रास्ता नहीं हो सकता है जिसे आप इनपुट करना चाहते हैं, लेकिन यह पथ की सही व्याख्या जैसा लगता है जैसा कि मैं बता सकता हूं। क्या आप विस्तृत कर सकते हैं?
jpmc26

2
@ jpmc26 मैं वास्तव में कुन्नूर का पालन नहीं करता हूं, लेकिन मैं कहूंगा कि (मैंने जो अनुमान लगाया है उसके विपरीत), abspathफ़ंक्शन के तर्क और वास्तविक फ़ाइल के बीच कोई संबंध नहीं है । आप कोई भी पाथनेम दे सकते हैं- गैर-मौजूद फाइलें और डायरेक्टरी हायरार्कीज ठीक हैं- और एब्सपैथ बस पथ के बिट्स को हल करेगा (मूल निर्देशिका सहित .."तत्व") और एक स्ट्रिंग लौटाएगा। यह वर्तमान निर्देशिका से गणना की गई एक स्ट्रिंग है; वास्तविक फ़ाइल में कोई सहसंबंध आकस्मिक है, ऐसा लगता है। कोशिश करो os.path.abspath("/wow/junk/../blha/hooey")। यह काम करता हैं।
माइक एस

2
@ माइक मैं ईमानदारी से यकीन नहीं कर रहा हूँ कि अप्रत्याशित व्यवहार क्यों होगा। यह निरपेक्ष पथ है , निरपेक्ष फ़ाइल या निर्देशिका नहीं है। यदि आप एक अस्तित्व की जांच चाहते हैं, तो कॉल करें os.path.exists। इसके विपरीत, पॉवरशेल जैसे सिस्टम जो मानक पथ रिज़ॉल्यूशन फ़ंक्शन के साथ मौजूद पथ पर जोर देते हैं, उपयोग करने के लिए एक दर्द है।
jpmc26

1
@ jpmc26 यह मानने के लिए कि एक पथ सिर्फ एक स्ट्रिंग है जो पथनाम जैसा दिखता है, बिल्कुल भी स्पष्ट नहीं है, और मैं कई सालों से पथनामें के बारे में सोच रहा हूं और बोल रहा हूं। मैं एब्सपैथ के लिए पायथन 3 डॉक्स को उद्धृत करता हूं: "पथनाम पथ का एक सामान्यीकृत निरपेक्ष संस्करण लौटाएं ।" नहीं "... स्ट्रिंग पथ का संस्करण "। एक पाथनाम, जैसा कि पॉज़िक्स द्वारा परिभाषित किया गया है, "एक स्ट्रिंग जो एक फ़ाइल की पहचान करने के लिए उपयोग की जाती है।" पायथन डॉक्स के बारे में स्पष्ट हैं relpath: "अस्तित्व या प्रकृति की पुष्टि करने के लिए फाइल सिस्टम एक्सेस नहीं किया गया है path"। यदि यहाँ तर्क स्पष्ट है, तो स्पष्ट क्यों है relpath?
माइक एस

77

आप नए पायथन 3.4 पुस्तकालय का उपयोग कर सकते हैं pathlib। (आप इसका उपयोग करके पायथन 2.6 या 2.7 के लिए भी प्राप्त कर सकते हैं pip install pathlib।) लेखकों ने लिखा : "इस लाइब्रेरी का उद्देश्य फाइलसिस्टम रास्तों को संभालने के लिए कक्षाओं का एक सरल पदानुक्रम प्रदान करना है और आम संचालन उपयोगकर्ता उन पर करते हैं।"

Windows में एक पूर्ण पथ प्राप्त करने के लिए:

>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'

या यूनिक्स पर:

>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'

डॉक्स यहां हैं: https://docs.python.org/3/library/pathlib.html


4
बहुत मददगार। उपयोग करने os.path.abspath()से मुझे एक त्रुटि मिली: एक ही रिश्तेदार फ़ाइलपैथ के साथ AttributeError: 'NoneType' object has no attribute 'startswith'उपयोग करना Path().resolve()। (Linux और Python3.4)
NuclearPeon

23

बेहतर अभी भी, मॉड्यूल स्थापित करें (पर पाया गया PyPI), यह सभी os.pathकार्यों और अन्य संबंधित कार्यों को एक ऑब्जेक्ट पर विधियों में लपेटता है जहां स्ट्रिंग्स का उपयोग किया जा सकता है:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>

2
बहुत बुरा वे stdlib में एक उचित फ़ाइल नाम अमूर्त मॉड्यूल कभी नहीं मिला।
टॉर्स्टन मारेक

1
@ टॉर्स्टन मारेक: यह एक पीड़ादायक और लंबे समय तक चूक है।
प्रवाह करें

4
उन्होंने अब पायथन 3.4: के लिए किया pathlib। इस सूत्र में मेरा उत्तर देखें।
ट्वासब्रिलिग

इस जवाब में yypos हैं। यह from path import Pathतब होना चाहिएPath('mydir/myfile.txt').abspath()
frakman1

कोई टाइपो नहीं हैं, आप एक अलग pathमॉड्यूल का उपयोग कर रहे होंगे । लिंक किए गए मॉड्यूल एक वर्ग नाम का उपयोग करता है path
टॉम

14

आज आप उस unipathपैकेज का भी उपयोग कर सकते हैं, जो इस पर आधारित था path.py: http://sluggo.scrapping.cc/python/unipath/

>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>

मैं इस पैकेज का उपयोग करने की सलाह दूंगा क्योंकि यह आम ओएस के लिए एक स्वच्छ इंटरफ़ेस प्रदान करता है


10

पायथन 3.4+ के लिए अपडेट pathlibजो वास्तव में इस सवाल का जवाब देता है:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

यदि आपको केवल एक अस्थायी स्ट्रिंग की आवश्यकता है, तो ध्यान रखें कि आप Pathसभी प्रासंगिक कार्यों के साथ वस्तुओं का उपयोग कर सकते हैं os.path, जिसमें पाठ्यक्रम भी शामिल है abspath:

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

ध्यान दें कि expanduserफ़ाइल (या निर्देशिका) के नाम और स्थान के लिए दी गई अभिव्यक्ति के मामले में (यूनिक्स पर) एक अग्रणी ~/(टिल्ड उपयोगकर्ता के होम डायरेक्टरी को संदर्भित करता है) हो सकता है, और expandvarsकिसी भी अन्य पर्यावरण चर (जैसे $HOME) का ख्याल रखता है ।


6

यह हमेशा वर्तमान स्क्रिप्ट का सही फ़ाइल नाम प्राप्त करता है, तब भी जब इसे किसी अन्य स्क्रिप्ट के भीतर से कहा जाता है। उपयोग करते समय यह विशेष रूप से उपयोगी है subprocess

import sys,os

filename = sys.argv[0]

वहाँ से, आप स्क्रिप्ट का पूरा रास्ता पा सकते हैं:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

यह केवल /..निर्देशिकाओं के पदानुक्रम में 'ऊपर' जाने के लिए जितनी बार चाहे उतनी बार फ़ोल्डर्स को नेविगेट करना आसान बनाता है ।

Cwd प्राप्त करने के लिए:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

मूल पथ के लिए:

>>> os.path.abspath(filename+"/../..")
'/foo'

"/.."अन्य फ़ाइलनामों के साथ संयोजन करके , आप सिस्टम में किसी भी फ़ाइल का उपयोग कर सकते हैं।


यह वह नहीं है जो पूछा जा रहा था। उन्होंने वर्तमान कामकाजी निर्देशिका के संबंध में एक मार्ग के बारे में पूछा, जो स्क्रिप्ट निर्देशिका के समान नहीं है, हालांकि वे कभी-कभी एक ही मूल्य वाले हो सकते हैं।
निर्माण का मूल

3

मॉड्यूल osपेट मार्ग खोजने के लिए एक रास्ता प्रदान करता है।

लेकिन लिनक्स में अधिकांश पथ ~(टिल्ड) से शुरू होते हैं , जो संतोषजनक परिणाम नहीं देता है।

तो आप उसके srblibलिए उपयोग कर सकते हैं ।

>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'

इसका उपयोग कर स्थापित करें python3 -m pip install srblib

https://pypi.org/project/srblib/


1

मैं ग्लोब का इस्तेमाल करना पसंद करती हूं

यहां आपके वर्तमान फ़ोल्डर में सभी फ़ाइल प्रकारों को सूचीबद्ध करने का तरीका बताया गया है:

import glob
for x in glob.glob():
    print(x)

यहां बताया गया है कि सभी (उदाहरण के लिए) .txt फ़ाइलों को अपने वर्तमान फ़ोल्डर में कैसे सूचीबद्ध करें:

import glob
for x in glob.glob('*.txt'):
    print(x)

यहाँ एक चुना निर्देशिका में सभी फ़ाइल प्रकारों को सूचीबद्ध करने का तरीका बताया गया है:

import glob
for x in glob.glob('C:/example/hi/hello/'):
    print(x)

आशा है कि इसने आपकी मदद की


2
आप एक अलग प्रश्न का उत्तर दे रहे हैं। यह नहीं था कि "मुझे रास्ता कैसे मिलेगा?", लेकिन "एक निरपेक्ष पथ"। आपके पहले दो मामलों के os.path.abspath()लिए जो भी रिश्तेदार मार्ग globप्रदान करता है, उसका सही उत्तर ( ) लागू हो सकता है ...
निक्टजेंस

1

यदि आप एक मैक पर हैं

import os
upload_folder = os.path.abspath("static/img/users")

इससे आपको पूरा रास्ता मिलेगा:

print(upload_folder)

निम्न पथ दिखाएगा:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

1

यदि कोई व्यक्ति अजगर और लिनक्स का उपयोग कर रहा है और फाइल करने के लिए पूर्ण मार्ग की तलाश कर रहा है:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.