Entuk lokasi (path) file sing mbukak ing Python: __file__.

Bisnis

Kanggo entuk lokasi (path) file script sing mbukak ing Python, gunakake __file__. Iki migunani kanggo mbukak file liyane adhedhasar lokasi file sing mbukak.

Nganti Python 3.8, __file__ ngasilake dalan sing ditemtokake nalika nglakokake printah python (utawa perintah python3 ing sawetara lingkungan). Yen dalan sing ditemtokake wis ditemtokake, jalur relatif bakal bali; yen dalan sing mutlak ditemtokake, dalan absolut bakal bali.

Ing Python 3.9 lan mengko, jalur absolut bali tanpa preduli saka dalan sing ditemtokake nalika runtime.

Isi ing ngisor iki dijlentrehake.

  • os.getcwd(),__file__
  • Goleki jeneng file lan jeneng direktori file sing lagi dieksekusi.
  • Entuk jalur absolut file sing dileksanakake.
  • Maca file liyane adhedhasar lokasi file sing saiki dieksekusi.
  • Pindhah direktori saiki menyang direktori file sing lagi dieksekusi.
  • Pangolahan sing padha bisa ditindakake tanpa dipikirake direktori saiki nalika runtime.

Deleng artikel ing ngisor iki kanggo informasi babagan njupuk lan ngganti direktori saiki (direktori sing digunakake).

Elinga yen __file__ ora bisa digunakake ing Jupyter Notebook (.ipynb).
Direktori sing dununge .ipynb bakal dileksanakake minangka direktori saiki, preduli saka direktori sing diwiwiti Jupyter Notebook.
Sampeyan bisa nggunakake os.chdir () ing kode kanggo ngganti direktori saiki.

os.getcwd () lan __file__.

Ing Windows, sampeyan bisa nggunakake perintah dir tinimbang pwd kanggo mriksa direktori saiki.

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

Gawe file script Python (file_path.py) kanthi konten ing ngisor iki ing level ngisor (data \ src).

import os

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

Jalanake printah python (utawa perintah python3 ing sawetara lingkungan) sing nemtokake dalan menyang file skrip.

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

Path absolut menyang direktori saiki bisa dipikolehi nganggo os.getcwd (). Sampeyan uga bisa nggunakake __file__ kanggo entuk dalan sing ditemtokake dening printah python3.

Nganti Python 3.8, __file__ bakal ngemot path sing kasebut ing printah python (utawa python3). Ing conto ing ndhuwur, jalur relatif bali amarga relatif, nanging jalur absolut bakal bali yen mutlak.

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 lan mengko ngasilake path absolut menyang __file__, ora preduli karo path sing ditemtokake ing printah python (utawa python3).

Ing conto ing ngisor iki, kita bakal nambah kode menyang file skrip sing padha (file_path.py) ing Python 3.7 lan mbukak relatif karo direktori ing ndhuwur.

Ing Python 3.7, jalur absolut digunakake. Asil ditampilake ing pungkasan bagean iki.

Goleki jeneng file lan jeneng direktori file sing lagi dieksekusi.

Kanggo entuk jeneng file lan jeneng direktori file sing mlaku, gunakake fungsi ing ngisor iki ing modul os.path perpustakaan standar.

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

Asil eksekusi.

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

Entuk jalur absolut file sing dileksanakake.

Yen jalur relatif dipikolehi kanthi __file__, bisa diowahi dadi jalur absolut kanthi os.path.abspath (). Direktori uga bisa dipikolehi minangka jalur absolut.

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

Asil eksekusi.

# 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

Yen dalan mutlak ditemtokake ing os.path.abspath (), mula bakal bali kaya saiki. Mula, yen __file__ minangka jalur mutlak, ing ngisor iki ora bakal nyebabake kesalahan.

  • os.path.abspath(__file__)

Maca file liyane adhedhasar lokasi file sing saiki dieksekusi.

Yen sampeyan pengin maca file liyane adhedhasar lokasi (path) file sing lagi dieksekusi, gabungake rong file ing ngisor iki kanthi nggunakake os.path.join ().

  • Direktori file sing lagi dileksanakake
  • Jalur relatif menyang file sing bakal diwaca saka file sing mlaku.

Yen sampeyan pengin maca file ing direktori sing padha karo file sing sampeyan lakoni, cukup jenengake jeneng file.

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

Asil eksekusi.

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

Tingkat ndhuwur diwakili dening “. \”. Sampeyan bisa nyelehake kaya saiki, nanging sampeyan bisa nggunakake os.path.normpath () kanggo normalake dalan lan mbusak ekstra “. \” Lan karakter liyane.

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

Asil eksekusi.

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

Pindhah direktori saiki menyang direktori file sing lagi dieksekusi.

Gunakake os.chdir () kanggo mindhah direktori saiki menyang direktori file sing dileksanakake ing skrip.

Sampeyan bisa ndeleng manawa dipindhah dening os.getcwd ().

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

Asil eksekusi.

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

Sawise direktori saiki wis dipindhah, sampeyan ora perlu nggabungake karo direktori file sing mlaku nalika maca file kasebut. Sampeyan mung bisa nemtokake path sing ana gandhengane karo direktori file sing mlaku.

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

Asil eksekusi.

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

Pangolahan sing padha bisa ditindakake tanpa dipikirake direktori saiki nalika runtime.

Kaya sing wis ditampilake, sampeyan bisa mbukak file adhedhasar lokasi file skrip, bebas saka direktori saiki nalika runtime, nggunakake salah sawijining metode ing ngisor iki.

  • Konfigurasi direktori file sing mlaku lan path relatif menyang file sing bakal diwaca saka file sing mbukak nganggo os.path.join ().
  • Pindhah direktori saiki menyang direktori file sing lagi dieksekusi.

Luwih gampang mindhah direktori saiki, nanging mesthine yen sampeyan pengin maca utawa nulis luwih akeh file sawise iku, sampeyan kudu mikir manawa direktori saiki wis dipindhah.

Asil conto sadurunge diringkes ing ngisor iki.

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

Asil saka nemtokake jalur mutlak yaiku ing ngisor iki.

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

Asil mindhah direktori saiki ing terminal lan nglakokake file skrip sing padha ditampilake ing ngisor iki. Sampeyan bisa ndeleng manawa file sing padha bisa diwaca sanajan wis dieksekusi saka lokasi sing beda.

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