Ili kupata eneo (njia) ya faili ya hati inayoendeshwa katika Python, tumia __file__. Hii ni muhimu kwa kupakia faili zingine kulingana na eneo la faili inayoendesha.
Hadi Python 3.8, __file__ inarudisha njia iliyoainishwa wakati wa kutekeleza amri ya chatu (au amri ya python3 katika mazingira kadhaa). Ikiwa njia ya jamaa imeainishwa, njia ya jamaa inarejeshwa; ikiwa njia kamili imetajwa, njia kamili inarejeshwa.
Katika Python 3.9 na baadaye, njia kamili inarejeshwa bila kujali njia iliyoainishwa wakati wa kukimbia.
Yaliyomo yafuatayo yamefafanuliwa.
os.getcwd()
,__file__
- Pata jina la faili na jina la saraka ya faili inayotekelezwa sasa.
- Pata njia kamili ya faili inayotekelezwa.
- Inasoma faili zingine kulingana na eneo la faili inayotekelezwa sasa.
- Sogeza saraka ya sasa kwa saraka ya faili inayotekelezwa.
- Usindikaji huo unaweza kufanywa bila kujali saraka ya sasa wakati wa kukimbia.
Tazama nakala ifuatayo kwa habari juu ya kupata na kubadilisha saraka ya sasa (saraka ya kufanya kazi).
- Nakala zinazohusiana:Pata na ubadilishe (songa) saraka ya sasa kwenye Python
Kumbuka kuwa __file__ haiwezi kutumika katika Jupyter Notebook (.ipynb).
Saraka ambayo .ipynb iko itatekelezwa kama saraka ya sasa, bila kujali saraka ambayo Jupyter Notebook imeanzishwa.
Inawezekana kutumia os.chdir () katika nambari kubadilisha saraka ya sasa.
- os.getcwd () na __file__.
- Pata jina la faili na jina la saraka ya faili inayotekelezwa sasa.
- Pata njia kamili ya faili inayotekelezwa.
- Inasoma faili zingine kulingana na eneo la faili inayotekelezwa sasa.
- Sogeza saraka ya sasa kwa saraka ya faili inayotekelezwa.
- Usindikaji huo unaweza kufanywa bila kujali saraka ya sasa wakati wa kukimbia.
os.getcwd () na __file__.
Katika Windows, unaweza kutumia amri ya dir badala ya pwd kuangalia saraka ya sasa.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
Unda faili ya hati ya Python (file_path.py) na yaliyomo katika kiwango cha chini (data \ src).
import os
print('getcwd: ', os.getcwd())
print('__file__: ', __file__)
Endesha amri ya chatu (au amri ya python3 katika mazingira mengine) ukitaja njia ya faili ya hati.
python3 data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: data/src/file_path.py
Njia kamili ya saraka ya sasa inaweza kupatikana na os.getcwd (). Unaweza pia kutumia __file__ kupata njia iliyoainishwa na amri ya python3.
Hadi Python 3.8, __file__ itakuwa na njia iliyoainishwa katika amri ya chatu (au python3). Katika mfano hapo juu, njia ya jamaa inarejeshwa kwa sababu ni ya jamaa, lakini njia kamili inarejeshwa ikiwa ni kamili.
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
Python 3.9 na baadaye inarudisha njia kamili kwa __file__, bila kujali njia iliyoainishwa katika amri ya chatu (au python3).
Katika mfano ufuatao, tutaongeza nambari kwenye faili ile ile ya faili (file_path.py) katika Python 3.7 na kuiendesha kulingana na saraka iliyo hapo juu.
Katika Python 3.7, njia kamili hutumiwa. Matokeo yameonyeshwa mwishoni mwa sehemu hii.
Pata jina la faili na jina la saraka ya faili inayotekelezwa sasa.
Ili kupata jina la faili na jina la saraka ya faili inayoendesha, tumia kazi ifuatayo katika moduli ya os.path ya maktaba ya kawaida.
os.path.basename()
os.path.dirname()
print('basename: ', os.path.basename(__file__))
print('dirname: ', os.path.dirname(__file__))
Matokeo ya utekelezaji.
# basename: file_path.py
# dirname: data/src
Pata njia kamili ya faili inayotekelezwa.
Ikiwa njia ya jamaa inapatikana na __file__, inaweza kubadilishwa kuwa njia kamili na os.path.abspath (). Saraka zinaweza pia kupatikana kama njia kamili.
print('abspath: ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))
Matokeo ya utekelezaji.
# 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
Ikiwa njia kamili imetajwa katika os.path.abspath (), itarudishwa kama ilivyo. Kwa hivyo, ikiwa __file__ ni njia kamili, zifuatazo hazitasababisha kosa.
os.path.abspath(__file__)
Inasoma faili zingine kulingana na eneo la faili inayotekelezwa sasa.
Ikiwa unataka kusoma faili zingine kulingana na eneo (njia) ya faili inayotekelezwa, jiunga na faili mbili zifuatazo ukitumia os.path.join ().
- Saraka ya faili inayotekelezwa
- Njia ya jamaa ya faili inayoweza kusomwa kutoka kwa faili inayoendesha.
Ikiwa unataka kusoma faili kwenye saraka sawa na faili unayoendesha, bonyeza tu jina la faili.
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())
Matokeo ya utekelezaji.
# [set target path 1]
# target_path_1: data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
Ngazi ya juu inawakilishwa na “. \”. Unaweza kuiacha ilivyo, lakini unaweza kutumia os.path.normpath () kurekebisha njia na kuondoa ziada “. \” Na wahusika wengine.
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())
Matokeo ya utekelezaji.
# [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" !!
Sogeza saraka ya sasa kwa saraka ya faili inayotekelezwa.
Tumia os.chdir () kusogeza saraka ya sasa kwa saraka ya faili inayotekelezwa kwenye hati.
- Nakala zinazohusiana:Pata na ubadilishe (songa) saraka ya sasa kwenye Python
Unaweza kuona kuwa inahamishwa na os.getcwd ().
print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd: ', os.getcwd())
Matokeo ya utekelezaji.
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
Mara tu saraka ya sasa imehamishwa, hakuna haja ya kuifunga na saraka ya faili inayoendesha wakati wa kusoma faili. Unaweza kutaja njia inayohusiana na saraka ya faili inayoendesha.
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())
Matokeo ya utekelezaji.
# [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" !!
Usindikaji huo unaweza kufanywa bila kujali saraka ya sasa wakati wa kukimbia.
Kama tulivyoonyesha, inawezekana kupakia faili kulingana na eneo la faili ya hati, huru kwa saraka ya sasa wakati wa kukimbia, ukitumia moja wapo ya njia zifuatazo.
- Thibitisha saraka ya faili inayoendesha na njia ya jamaa ya faili inayoweza kusomwa kutoka kwa faili inayoendesha ukitumia os.path.join ().
- Sogeza saraka ya sasa kwa saraka ya faili inayotekelezwa.
Ni rahisi kuhamisha saraka ya sasa, lakini kwa kweli, ikiwa unataka kusoma au kuandika faili zaidi baada ya hapo, unahitaji kuzingatia kuwa saraka ya sasa imehamishwa.
Matokeo ya mifano ya awali yamefupishwa hapa chini.
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" !!
Matokeo ya kubainisha njia kamili ni kama ifuatavyo.
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" !!
Matokeo ya kuhamisha saraka ya sasa kwenye terminal na kutekeleza faili ile ile ya script imeonyeshwa hapa chini. Unaweza kuona kwamba faili hiyo hiyo inaweza kusomwa hata ikiwa inatekelezwa kutoka eneo tofauti.
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" !!