Marrja e vendndodhjes (shtegut) të një skedari që funksionon në Python: __file__.

biznes

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).

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__.

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.

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" !!

Copied title and URL