Mendapatkan lokasi (jalan) fail yang sedang berjalan di Python: __file__.

Perniagaan

Untuk mendapatkan lokasi (jalan) fail skrip yang sedang berjalan di Python, gunakan __file__. Ini berguna untuk memuatkan fail lain berdasarkan lokasi fail yang sedang berjalan.

Hingga Python 3.8, __file__ mengembalikan jalan yang ditentukan semasa melaksanakan perintah python (atau perintah python3 di beberapa persekitaran). Sekiranya jalan relatif ditentukan, jalan relatif dikembalikan; jika jalan mutlak ditentukan, jalan mutlak dikembalikan.

Di Python 3.9 dan yang lebih baru, jalan mutlak dikembalikan tanpa mengira jalan yang ditentukan pada waktu runtime.

Kandungan berikut dijelaskan.

  • os.getcwd(),__file__
  • Dapatkan nama fail dan nama direktori fail yang sedang dijalankan.
  • Dapatkan jalan mutlak fail yang sedang dijalankan.
  • Membaca fail lain berdasarkan lokasi fail yang sedang dijalankan.
  • Pindahkan direktori semasa ke direktori fail yang sedang dijalankan.
  • Pemprosesan yang sama dapat dilakukan tanpa mengira direktori semasa pada waktu runtime.

Lihat artikel berikut untuk mendapatkan maklumat tentang mendapatkan dan mengubah direktori semasa (direktori kerja).

Perhatikan bahawa __file__ tidak boleh digunakan dalam Jupyter Notebook (.ipynb).
Direktori di mana .ipynb berada akan dieksekusi sebagai direktori saat ini, terlepas dari direktori di mana Jupyter Notebook dimulakan.
Anda boleh menggunakan os.chdir () dalam kod untuk mengubah direktori semasa.

os.getcwd () dan __file__.

Di Windows, anda boleh menggunakan perintah dir dan bukan pwd untuk memeriksa direktori semasa.

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

Buat fail skrip Python (file_path.py) dengan kandungan berikut di tingkat bawah (data \ src).

import os

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

Jalankan perintah python (atau perintah python3 di beberapa persekitaran) menentukan jalan ke fail skrip.

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

Jalan mutlak ke direktori semasa dapat diperoleh dengan os.getcwd (). Anda juga boleh menggunakan __file__ untuk mendapatkan jalan yang ditentukan oleh perintah python3.

Hingga Python 3.8, __file__ akan mengandungi jalan yang ditentukan dalam perintah python (atau python3). Dalam contoh di atas, jalan relatif dikembalikan kerana ia relatif, tetapi jalan mutlak dikembalikan jika ia 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 dan kemudian mengembalikan jalan mutlak ke __file__, tanpa mengira jalan yang ditentukan dalam perintah python (atau python3).

Dalam contoh berikut, kami akan menambahkan kod ke fail skrip yang sama (file_path.py) di Python 3.7 dan menjalankannya berbanding dengan direktori di atas.

Di Python 3.7, jalan mutlak digunakan. Hasilnya ditunjukkan di akhir bahagian ini.

Dapatkan nama fail dan nama direktori fail yang sedang dijalankan.

Untuk mendapatkan nama fail dan nama direktori fail yang sedang berjalan, gunakan fungsi berikut dalam modul os.path perpustakaan standard.

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

Hasil pelaksanaan.

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

Dapatkan jalan mutlak fail yang sedang dijalankan.

Sekiranya jalan relatif diperoleh dengan __file__, ia boleh ditukar menjadi jalur mutlak dengan os.path.abspath (). Direktori juga boleh diperoleh sebagai jalan mutlak.

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

Hasil pelaksanaan.

# 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

Sekiranya jalan mutlak ditentukan dalam os.path.abspath (), ia akan dikembalikan sebagaimana adanya. Oleh itu, jika __file__ adalah jalan mutlak, yang berikut tidak akan menyebabkan ralat.

  • os.path.abspath(__file__)

Membaca fail lain berdasarkan lokasi fail yang sedang dijalankan.

Sekiranya anda ingin membaca fail lain berdasarkan lokasi (jalan) fail yang sedang dijalankan, gabungkan dua fail berikut menggunakan os.path.join ().

  • Direktori fail yang sedang dijalankan
  • Jalan relatif ke fail yang akan dibaca dari fail yang sedang berjalan.

Sekiranya anda ingin membaca fail dalam direktori yang sama dengan fail yang anda jalankan, gabungkan nama failnya.

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

Hasil pelaksanaan.

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

Tingkat atas diwakili oleh “. \”. Anda boleh membiarkannya seperti sedia ada, tetapi anda boleh menggunakan os.path.normpath () untuk menormalkan jalan dan mengeluarkan tambahan “. \” Dan watak lain.

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

Hasil pelaksanaan.

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

Pindahkan direktori semasa ke direktori fail yang sedang dijalankan.

Gunakan os.chdir () untuk memindahkan direktori semasa ke direktori file yang dieksekusi dalam skrip.

Anda dapat melihat bahawa ia dipindahkan oleh os.getcwd ().

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

Hasil pelaksanaan.

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

Setelah direktori semasa dipindahkan, tidak perlu menggabungkannya dengan direktori file yang sedang berjalan ketika membaca file. Anda hanya boleh menentukan jalan yang berkaitan dengan direktori fail yang sedang berjalan.

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

Hasil pelaksanaan.

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

Pemprosesan yang sama dapat dilakukan tanpa mengira direktori semasa pada waktu runtime.

Seperti yang telah kami tunjukkan, dimungkinkan untuk memuatkan file berdasarkan lokasi file skrip, tidak bergantung pada direktori saat ini pada saat runtime, menggunakan salah satu metode berikut.

  • Gabungkan direktori fail yang sedang berjalan dan jalan relatif ke fail yang akan dibaca dari fail yang sedang berjalan menggunakan os.path.join ().
  • Pindahkan direktori semasa ke direktori fail yang sedang dijalankan.

Lebih mudah untuk memindahkan direktori semasa, tetapi tentu saja, jika anda ingin membaca atau menulis lebih banyak fail selepas itu, anda perlu mengambil kira bahawa direktori semasa telah dipindahkan.

Hasil contoh sebelumnya diringkaskan di bawah.

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

Hasil menentukan jalan mutlak adalah seperti berikut.

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

Hasil memindahkan direktori semasa di terminal dan menjalankan fail skrip yang sama ditunjukkan di bawah. Anda dapat melihat bahawa fail yang sama dapat dibaca walaupun dijalankan dari lokasi yang berbeza.

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