Për të marrë vendndodhjen (rrugën) e një skedari skripti që funksionon në Python, përdorni __file__. Kjo është e dobishme për ngarkimin e skedarëve të tjerë bazuar në vendndodhjen e skedarit që funksionon.
Deri në Python 3.8, __file__ kthen rrugën e specifikuar gjatë ekzekutimit të komandës python (ose komandës python3 në disa mjedise). Nëse specifikohet një rrugë relative, rruga relative kthehet; nëse përcaktohet një rrugë absolute, rruga absolute kthehet.
Në Python 3.9 dhe më vonë, rruga absolute kthehet pavarësisht nga rruga e specifikuar në kohën e ekzekutimit.
Përmbajtja e mëposhtme shpjegohet.
os.getcwd()
,__file__
- Merrni emrin e skedarit dhe emrin e drejtorisë së skedarit aktualisht në ekzekutim.
- Merrni rrugën absolute të skedarit që po ekzekutohet.
- Lexon skedarë të tjerë bazuar në vendndodhjen e skedarit aktualisht në ekzekutim.
- Zhvendosni drejtorinë aktuale në drejtorinë e skedarit që po ekzekutohet.
- I njëjti përpunim mund të bëhet pavarësisht nga drejtoria aktuale në kohën e ekzekutimit.
Shih artikullin vijues për informacion mbi marrjen dhe ndryshimin e drejtorisë aktuale (drejtoria e punës).
- Artikujt e lidhur:Merrni dhe ndryshoni (lëvizni) drejtorinë aktuale në Python
Vini re se __fajl__ nuk mund të përdoret në Jupyter Notebook (.ipynb).
Drejtoria ku ndodhet .ipynb do të ekzekutohet si drejtoria aktuale, pavarësisht nga drejtoria ku është nisur Jupyter Notebook.
Theshtë e mundur të përdorni os.chdir () në kod për të ndryshuar drejtorinë aktuale.
- os.getcwd () dhe __fajl__.
- Merrni emrin e skedarit dhe emrin e drejtorisë së skedarit aktualisht në ekzekutim.
- Merrni rrugën absolute të skedarit që po ekzekutohet.
- Lexon skedarë të tjerë bazuar në vendndodhjen e skedarit aktualisht në ekzekutim.
- Zhvendosni drejtorinë aktuale në drejtorinë e skedarit që po ekzekutohet.
- I njëjti përpunim mund të bëhet pavarësisht nga drejtoria aktuale në kohën e ekzekutimit.
os.getcwd () dhe __fajl__.
Në Windows, mund të përdorni komandën dir në vend të pwd për të kontrolluar drejtorinë aktuale.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
Krijoni një skedar të shkrimit Python (file_path.py) me përmbajtjen e mëposhtme në nivelin më të ulët (data \ src).
import os
print('getcwd: ', os.getcwd())
print('__file__: ', __file__)
Drejtoni komandën python (ose komandën python3 në disa mjedise) duke specifikuar rrugën drejt skedarit të skriptit.
python3 data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: data/src/file_path.py
Rruga absolute për drejtorinë aktuale mund të merret me os.getcwd (). Ju gjithashtu mund të përdorni __file__ për të marrë rrugën e specifikuar nga komanda python3.
Deri në Python 3.8, __file__ do të përmbajë shtegun e specifikuar në komandën python (ose python3). Në shembullin e mësipërm, rruga relative kthehet sepse është relative, por rruga absolute kthehet nëse është absolute.
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 dhe më vonë kthen shtegun absolut në __fajl__, pavarësisht nga rruga e specifikuar në komandën python (ose python3).
Në shembullin e mëposhtëm, ne do të shtojmë kodin në të njëjtin skedar skripti (file_path.py) në Python 3.7 dhe do ta ekzekutojmë atë në lidhje me drejtorinë e mësipërme.
Në Python 3.7, përdoret rruga absolute. Rezultatet janë treguar në fund të këtij seksioni.
Merrni emrin e skedarit dhe emrin e drejtorisë së skedarit aktualisht në ekzekutim.
Për të marrë emrin e skedarit dhe emrin e drejtorisë së skedarit që funksionon, përdorni funksionin e mëposhtëm në modulin os.path të bibliotekës standarde.
os.path.basename()
os.path.dirname()
print('basename: ', os.path.basename(__file__))
print('dirname: ', os.path.dirname(__file__))
Rezultati i ekzekutimit.
# basename: file_path.py
# dirname: data/src
Merrni rrugën absolute të skedarit që po ekzekutohet.
Nëse një shteg relativ merret me __file__, ajo mund të konvertohet në një rrugë absolute me os.path.abspath (). Drejtoritë gjithashtu mund të merren si rrugë absolute.
print('abspath: ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))
Rezultati i ekzekutimit.
# 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
Nëse një rrugë absolute është e specifikuar në os.path.abspath (), ajo do të kthehet ashtu siç është. Prandaj, nëse __fajl__ është një rrugë absolute, sa vijon nuk do të shkaktojë një gabim.
os.path.abspath(__file__)
Lexon skedarë të tjerë bazuar në vendndodhjen e skedarit aktualisht në ekzekutim.
Nëse dëshironi të lexoni skedarë të tjerë bazuar në vendndodhjen (rrugën) e skedarit që po ekzekutohet, bashkoni dy skedarët e mëposhtëm duke përdorur os.path.join ().
- Drejtoria e skedarit që po ekzekutohet
- Rruga relative e skedarit që do të lexohet nga skedari që funksionon.
Nëse dëshironi të lexoni një skedar në të njëjtën drejtori me skedarin që po përdorni, thjesht bashkoni emrin e skedarit.
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())
Rezultati i ekzekutimit.
# [set target path 1]
# target_path_1: data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
Niveli i sipërm përfaqësohet me “. \”. Mund ta lini ashtu siç është, por mund të përdorni os.path.normpath () për të normalizuar rrugën dhe për të hequr “. \” Shtesë dhe karaktere të tjera.
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())
Rezultati i ekzekutimit.
# [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" !!
Zhvendosni drejtorinë aktuale në drejtorinë e skedarit që po ekzekutohet.
Përdorni os.chdir () për të zhvendosur drejtorinë aktuale në drejtorinë e skedarit që ekzekutohet në skript.
- Artikujt e lidhur:Merrni dhe ndryshoni (lëvizni) drejtorinë aktuale në Python
Ju mund të shihni se ajo është lëvizur nga os.getcwd ().
print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd: ', os.getcwd())
Rezultati i ekzekutimit.
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
Pasi të jetë zhvendosur drejtoria aktuale, nuk ka nevojë ta bashkoni atë me drejtorinë e skedarit që funksionon kur lexoni skedarin. Ju thjesht mund të specifikoni shtegun në lidhje me drejtorinë e skedarit që funksionon.
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())
Rezultati i ekzekutimit.
# [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" !!
I njëjti përpunim mund të bëhet pavarësisht nga drejtoria aktuale në kohën e ekzekutimit.
Siç kemi treguar, është e mundur të ngarkoni skedarë bazuar në vendndodhjen e skedarit të skriptit, pavarësisht nga drejtoria aktuale në kohën e ekzekutimit, duke përdorur një nga metodat e mëposhtme.
- Bashkoni drejtorinë e skedarit që funksionon dhe shtegun relativ të skedarit që do të lexohet nga skedari që ekzekutohet duke përdorur os.path.join ().
- Zhvendosni drejtorinë aktuale në drejtorinë e skedarit që po ekzekutohet.
Isshtë më e lehtë të lëvizësh drejtorinë aktuale, por natyrisht, nëse dëshiron të lexosh ose të shkruash më shumë skedarë pas kësaj, duhet të marrësh parasysh se drejtoria aktuale është zhvendosur.
Rezultatet e shembujve të mëparshëm janë përmbledhur më poshtë.
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" !!
Rezultati i specifikimit të rrugës absolute është si më poshtë.
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" !!
Rezultati i lëvizjes së drejtorisë aktuale në terminal dhe ekzekutimit të skedarit të njëjtë të skriptit është treguar më poshtë. Ju mund të shihni që i njëjti skedar mund të lexohet edhe nëse ekzekutohet nga një vend tjetër.
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" !!