Dobivanje lokacije (putanje) pokrenute datoteke u Pythonu: __file__.

Poslovanje

Da biste dobili lokaciju (putanju) pokrenute datoteke skripte u Pythonu, upotrijebite __file__. Ovo je korisno za učitavanje drugih datoteka na temelju lokacije pokrenute datoteke.

Do Python 3.8, __file__ vraća put naveden prilikom izvršavanja naredbe python (ili naredbe python3 u nekim okruženjima). Ako je naveden relativni put, vraća se relativni put; ako je naveden apsolutni put, vraća se apsolutni put.

U Pythonu 3.9 i novijim, apsolutni put se vraća bez obzira na put naveden u vrijeme izvođenja.

Objašnjeni su sljedeći sadržaji.

  • os.getcwd(),__file__
  • Dohvatite naziv datoteke i naziv direktorija datoteke koja se trenutno izvršava.
  • Dobijte apsolutni put do datoteke koja se izvršava.
  • Čita druge datoteke na temelju lokacije datoteke koja se trenutno izvršava.
  • Premjestite trenutni direktorij u direktorij izvršne datoteke.
  • Ista obrada može se obaviti bez obzira na trenutni direktorij u vrijeme izvođenja.

Za informacije o preuzimanju i promjeni trenutnog direktorija (radnog imenika) pogledajte sljedeći članak.

Imajte na umu da se __file__ ne može koristiti u Jupyter Notebooku (.ipynb).
Direktorij u kojem se nalazi .ipynb izvršit će se kao trenutni direktorij, bez obzira na direktorij u kojem je pokrenuta Jupyter Notebook.
Moguće je koristiti os.chdir () u kodu za promjenu trenutnog direktorija.

os.getcwd () i __file__.

U sustavu Windows možete koristiti naredbu dir umjesto pwd za provjeru trenutnog direktorija.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

Izradite datoteku skripte Python (file_path.py) sa sljedećim sadržajem na nižoj razini (data \ src).

import os

print('getcwd:      ', os.getcwd())
print('__file__:    ', __file__)

Pokrenite naredbu python (ili naredbu python3 u nekim okruženjima) navodeći put do datoteke skripte.

python3 data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     data/src/file_path.py

Apsolutni put do trenutnog direktorija može se dobiti pomoću os.getcwd (). Također možete koristiti __file__ da biste dobili put naveden naredbom python3.

Do Python 3.8, __file__ će sadržavati put naveden u naredbi python (ili python3). U gornjem primjeru vraća se relativni put jer je relativan, ali apsolutni put se vraća ako je apsolutan.

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 i noviji vraća apsolutni put do __file__, bez obzira na put naveden u naredbi python (ili python3).

U sljedećem primjeru kôd ćemo dodati u istu datoteku skripte (file_path.py) u Pythonu 3.7 i pokrenuti ga u odnosu na gornji direktorij.

U Pythonu 3.7 koristi se apsolutni put. Rezultati su prikazani na kraju ovog odjeljka.

Dohvatite naziv datoteke i naziv direktorija datoteke koja se trenutno izvršava.

Da biste dobili naziv datoteke i naziv direktorija pokrenute datoteke, upotrijebite sljedeću funkciju u modulu os.path standardne knjižnice.

  • os.path.basename()
  • os.path.dirname()
print('basename:    ', os.path.basename(__file__))
print('dirname:     ', os.path.dirname(__file__))

Rezultat izvršenja.

# basename:     file_path.py
# dirname:      data/src

Dobijte apsolutni put do datoteke koja se izvršava.

Ako se relativna staza dobije s __file__, ona se može pretvoriti u apsolutnu stazu pomoću os.path.abspath (). Imenici se mogu dobiti i kao apsolutni putovi.

print('abspath:     ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))

Rezultat izvršenja.

# 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

Ako je apsolutni put naveden u os.path.abspath (), bit će vraćen takav kakav jest. Stoga, ako je __file__ apsolutni put, sljedeće neće uzrokovati pogrešku.

  • os.path.abspath(__file__)

Čita druge datoteke na temelju lokacije datoteke koja se trenutno izvršava.

Ako želite čitati druge datoteke na temelju lokacije (putanje) datoteke koja se izvršava, pridružite sljedeće dvije datoteke pomoću os.path.join ().

  • Direktorij datoteke koja se izvršava
  • Relativni put do datoteke za čitanje iz pokrenute datoteke.

Ako želite čitati datoteku u istom direktoriju kao i datoteka koju pokrećete, samo povežite naziv datoteke.

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

Rezultat izvršenja.

# [set target path 1]
# target_path_1:  data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!

Gornja razina predstavljena je s “. \”. Možete ostaviti kako jest, ali možete koristiti os.path.normpath () za normalizaciju putanje i uklanjanje dodatnih “. \” I drugih znakova.

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

Rezultat izvršenja.

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

Premjestite trenutni direktorij u direktorij izvršne datoteke.

Pomoću os.chdir () premjestite trenutni direktorij u direktorij datoteke koja se izvršava u skripti.

Možete vidjeti da je premješten os.getcwd ().

print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd:      ', os.getcwd())

Rezultat izvršenja.

# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src

Nakon premještanja trenutnog direktorija, nema potrebe za njegovim spajanjem s direktorijem pokrenute datoteke prilikom čitanja datoteke. Možete samo odrediti put u odnosu na direktorij pokrenute datoteke.

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

Rezultat izvršenja.

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

Ista obrada može se obaviti bez obzira na trenutni direktorij u vrijeme izvođenja.

Kao što smo pokazali, moguće je učitati datoteke na temelju lokacije skriptne datoteke, neovisno o trenutnom direktoriju u vrijeme izvođenja, koristeći jednu od sljedećih metoda.

  • Spojite direktorij pokrenute datoteke i relativni put do datoteke za čitanje iz pokrenute datoteke pomoću os.path.join ().
  • Premjestite trenutni direktorij u direktorij izvršne datoteke.

Lakše je premjestiti trenutni direktorij, ali naravno, ako želite nakon toga čitati ili pisati više datoteka, morate uzeti u obzir da je trenutni direktorij premješten.

Rezultati prethodnih primjera sažeti su u nastavku.

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

Rezultat specificiranja apsolutnog puta je sljedeći.

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

Rezultat premještanja trenutnog direktorija u terminalu i izvršavanja iste datoteke skripte prikazan je u nastavku. Možete vidjeti da se ista datoteka može pročitati čak i ako se izvršava s drugog mjesta.

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