पायथन में चल रही स्क्रिप्ट फ़ाइल का स्थान (पथ) प्राप्त करने के लिए, __file__ का उपयोग करें। यह चल रही फ़ाइल के स्थान के आधार पर अन्य फ़ाइलों को लोड करने के लिए उपयोगी है।
पायथन 3.8 तक, __file__ अजगर कमांड (या कुछ वातावरण में python3 कमांड) को निष्पादित करते समय निर्दिष्ट पथ लौटाता है। यदि कोई सापेक्ष पथ निर्दिष्ट है, तो सापेक्ष पथ वापस कर दिया जाता है; यदि एक पूर्ण पथ निर्दिष्ट है, तो पूर्ण पथ वापस कर दिया जाता है।
पायथन 3.9 और बाद में, रनटाइम पर निर्दिष्ट पथ की परवाह किए बिना निरपेक्ष पथ वापस कर दिया जाता है।
निम्नलिखित सामग्री की व्याख्या की गई है।
os.getcwd()
,__file__
- वर्तमान में निष्पादित फ़ाइल का फ़ाइल नाम और निर्देशिका नाम प्राप्त करें।
- निष्पादित की जा रही फ़ाइल का निरपेक्ष पथ प्राप्त करें।
- वर्तमान में निष्पादित फ़ाइल के स्थान के आधार पर अन्य फ़ाइलों को पढ़ता है।
- वर्तमान निर्देशिका को निष्पादित की जा रही फ़ाइल की निर्देशिका में ले जाएँ।
- रनटाइम पर वर्तमान निर्देशिका की परवाह किए बिना समान प्रसंस्करण किया जा सकता है।
वर्तमान निर्देशिका (कार्यशील निर्देशिका) प्राप्त करने और बदलने के बारे में जानकारी के लिए निम्न आलेख देखें।
ध्यान दें कि जुपिटर नोटबुक (.ipynb) में __file__ का उपयोग नहीं किया जा सकता है।
जिस निर्देशिका में .ipynb स्थित है, उसे वर्तमान निर्देशिका के रूप में निष्पादित किया जाएगा, चाहे उस निर्देशिका की परवाह किए बिना जहां ज्यूपिटर नोटबुक शुरू की गई हो।
वर्तमान निर्देशिका को बदलने के लिए कोड में os.chdir() का उपयोग करना संभव है।
- os.getcwd() और __file__।
- वर्तमान में निष्पादित फ़ाइल का फ़ाइल नाम और निर्देशिका नाम प्राप्त करें।
- निष्पादित की जा रही फ़ाइल का निरपेक्ष पथ प्राप्त करें।
- वर्तमान में निष्पादित फ़ाइल के स्थान के आधार पर अन्य फ़ाइलों को पढ़ता है।
- वर्तमान निर्देशिका को निष्पादित की जा रही फ़ाइल की निर्देशिका में ले जाएँ।
- रनटाइम पर वर्तमान निर्देशिका की परवाह किए बिना समान प्रसंस्करण किया जा सकता है।
os.getcwd() और __file__।
विंडोज़ में, आप वर्तमान निर्देशिका की जांच के लिए पीडब्ल्यूडी के बजाय डीआईआर कमांड का उपयोग कर सकते हैं।
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
निचले स्तर (डेटा \ src) में निम्न सामग्री के साथ एक पायथन स्क्रिप्ट फ़ाइल (file_path.py) बनाएं।
import os
print('getcwd: ', os.getcwd())
print('__file__: ', __file__)
स्क्रिप्ट फ़ाइल के पथ को निर्दिष्ट करते हुए अजगर कमांड (या कुछ वातावरण में python3 कमांड) चलाएँ।
python3 data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: data/src/file_path.py
वर्तमान निर्देशिका का पूर्ण पथ os.getcwd() के साथ प्राप्त किया जा सकता है। आप python3 कमांड द्वारा निर्दिष्ट पथ प्राप्त करने के लिए __file__ का भी उपयोग कर सकते हैं।
Python 3.8 तक, __file__ में python (या python3) कमांड में निर्दिष्ट पथ होगा। ऊपर के उदाहरण में, सापेक्ष पथ लौटाया जाता है क्योंकि यह सापेक्ष है, लेकिन निरपेक्ष पथ लौटाया जाता है यदि यह निरपेक्ष है।
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
python3 /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
पायथन 3.9 और बाद में __file__ के लिए पूर्ण पथ लौटाता है, भले ही अजगर (या पायथन 3) कमांड में निर्दिष्ट पथ की परवाह किए बिना।
निम्नलिखित उदाहरण में, हम पायथन 3.7 में उसी स्क्रिप्ट फ़ाइल (file_path.py) में कोड जोड़ेंगे और इसे उपरोक्त निर्देशिका के सापेक्ष चलाएंगे।
पायथन 3.7 में, निरपेक्ष पथ का उपयोग किया जाता है। परिणाम इस खंड के अंत में दिखाए गए हैं।
वर्तमान में निष्पादित फ़ाइल का फ़ाइल नाम और निर्देशिका नाम प्राप्त करें।
चल रही फ़ाइल का फ़ाइल नाम और निर्देशिका नाम प्राप्त करने के लिए, मानक पुस्तकालय के os.path मॉड्यूल में निम्न फ़ंक्शन का उपयोग करें।
os.path.basename()
os.path.dirname()
print('basename: ', os.path.basename(__file__))
print('dirname: ', os.path.dirname(__file__))
निष्पादन परिणाम।
# basename: file_path.py
# dirname: data/src
निष्पादित की जा रही फ़ाइल का निरपेक्ष पथ प्राप्त करें।
यदि __file__ के साथ एक सापेक्ष पथ प्राप्त किया जाता है, तो इसे os.path.abspath() के साथ एक पूर्ण पथ में परिवर्तित किया जा सकता है। निर्देशिकाओं को पूर्ण पथ के रूप में भी प्राप्त किया जा सकता है।
print('abspath: ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))
निष्पादन परिणाम।
# abspath: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
यदि os.path.abspath() में एक पूर्ण पथ निर्दिष्ट किया गया है, तो इसे वापस कर दिया जाएगा। इसलिए, यदि __file__ एक निरपेक्ष पथ है, तो निम्न में कोई त्रुटि नहीं होगी।
os.path.abspath(__file__)
वर्तमान में निष्पादित फ़ाइल के स्थान के आधार पर अन्य फ़ाइलों को पढ़ता है।
यदि आप निष्पादित की जा रही फ़ाइल के स्थान (पथ) के आधार पर अन्य फ़ाइलों को पढ़ना चाहते हैं, तो os.path.join() का उपयोग करके निम्न दो फ़ाइलों को शामिल करें।
- फ़ाइल की निर्देशिका निष्पादित की जा रही है
- फ़ाइल के सापेक्ष पथ को चल रही फ़ाइल से पढ़ा जाना है।
यदि आप फ़ाइल को उसी निर्देशिका में पढ़ना चाहते हैं जिस फ़ाइल को आप चला रहे हैं, तो बस फ़ाइल नाम को संयोजित करें।
print('[set target path 1]')
target_path_1 = os.path.join(os.path.dirname(__file__), 'target_1.txt')
print('target_path_1: ', target_path_1)
print('read target file:')
with open(target_path_1) as f:
print(f.read())
निष्पादन परिणाम।
# [set target path 1]
# target_path_1: data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
ऊपरी स्तर को “. \” द्वारा दर्शाया जाता है। आप इसे वैसे ही छोड़ सकते हैं, लेकिन आप पथ को सामान्य करने और अतिरिक्त “. \” और अन्य वर्णों को निकालने के लिए os.path.normpath() का उपयोग कर सकते हैं।
print('[set target path 2]')
target_path_2 = os.path.join(os.path.dirname(__file__), '../dst/target_2.txt')
print('target_path_2: ', target_path_2)
print('normalize : ', os.path.normpath(target_path_2))
print('read target file:')
with open(target_path_2) as f:
print(f.read())
निष्पादन परिणाम।
# [set target path 2]
# target_path_2: data/src/../dst/target_2.txt
# normalize : data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
वर्तमान निर्देशिका को निष्पादित की जा रही फ़ाइल की निर्देशिका में ले जाएँ।
स्क्रिप्ट में निष्पादित की जा रही फ़ाइल की निर्देशिका में वर्तमान निर्देशिका को स्थानांतरित करने के लिए os.chdir() का उपयोग करें।
आप देख सकते हैं कि इसे os.getcwd() द्वारा स्थानांतरित किया गया है।
print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd: ', os.getcwd())
निष्पादन परिणाम।
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
एक बार वर्तमान निर्देशिका को स्थानांतरित कर दिया गया है, फ़ाइल को पढ़ते समय इसे चल रही फ़ाइल की निर्देशिका के साथ जोड़ने की कोई आवश्यकता नहीं है। आप केवल चल रही फ़ाइल की निर्देशिका के सापेक्ष पथ निर्दिष्ट कर सकते हैं।
print('[set target path 1 (after chdir)]')
target_path_1 = 'target_1.txt'
print('target_path_1: ', target_path_1)
print('read target file:')
with open(target_path_1) as f:
print(f.read())
print()
print('[set target path 2 (after chdir)]')
target_path_2 = '../dst/target_2.txt'
print('target_path_2: ', target_path_2)
print('read target file:')
with open(target_path_2) as f:
print(f.read())
निष्पादन परिणाम।
# [set target path 1 (after chdir)]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2 (after chdir)]
# target_path_2: ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
रनटाइम पर वर्तमान निर्देशिका की परवाह किए बिना समान प्रसंस्करण किया जा सकता है।
जैसा कि हमने दिखाया है, निम्न विधियों में से किसी एक का उपयोग करके, रनटाइम पर वर्तमान निर्देशिका से स्वतंत्र, स्क्रिप्ट फ़ाइल के स्थान के आधार पर फ़ाइलों को लोड करना संभव है।
- os.path.join() का उपयोग करके चल रही फ़ाइल की निर्देशिका और फ़ाइल के सापेक्ष पथ को चल रही फ़ाइल से पढ़ने के लिए संयोजित करें।
- वर्तमान निर्देशिका को निष्पादित की जा रही फ़ाइल की निर्देशिका में ले जाएँ।
वर्तमान निर्देशिका को स्थानांतरित करना आसान है, लेकिन निश्चित रूप से, यदि आप उसके बाद और फाइलें पढ़ना या लिखना चाहते हैं, तो आपको यह ध्यान रखना होगा कि वर्तमान निर्देशिका को स्थानांतरित कर दिया गया है।
पिछले उदाहरणों के परिणाम नीचे संक्षेप में दिए गए हैं।
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
python3 data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: data/src/file_path.py
# basename: file_path.py
# dirname: data/src
# abspath: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1]
# target_path_1: data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2]
# target_path_2: data/src/../dst/target_2.txt
# normalize : data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
#
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1 (after chdir)]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2 (after chdir)]
# target_path_2: ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
निरपेक्ष पथ निर्दिष्ट करने का परिणाम इस प्रकार है।
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
python3 /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# basename: file_path.py
# dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# abspath: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1]
# target_path_1: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2]
# target_path_2: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/../dst/target_2.txt
# normalize : /Users/mbp/Documents/my-project/python-snippets/notebook/data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
#
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1 (after chdir)]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2 (after chdir)]
# target_path_2: ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
टर्मिनल में वर्तमान निर्देशिका को स्थानांतरित करने और उसी स्क्रिप्ट फ़ाइल को निष्पादित करने का परिणाम नीचे दिखाया गया है। आप देख सकते हैं कि एक ही फ़ाइल को पढ़ा जा सकता है, भले ही इसे किसी भिन्न स्थान से निष्पादित किया गया हो।
cd data/src
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
python3 file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# __file__: file_path.py
# basename: file_path.py
# dirname:
# abspath: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2]
# target_path_2: ../dst/target_2.txt
# normalize : ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
#
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1 (after chdir)]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2 (after chdir)]
# target_path_2: ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!