Käimasoleva faili asukoha (tee) saamine Pythonis: __file__.

Äri

Käimasoleva skriptifaili asukoha (tee) saamiseks Pythonis kasuta __file__. See on kasulik teiste failide laadimiseks jooksva faili asukoha alusel.

Kuni Python 3.8-ni tagastab __file__ käsu python (või mõnes keskkonnas käsu python3) käivitamisel määratud tee. Kui on määratud suhteline tee, tagastatakse suhteline tee; kui on määratud absoluutne tee, tagastatakse absoluutne tee.

Python 3.9 ja hilisemates versioonides tagastatakse absoluutne teekond sõltumata töö ajal määratud teekonnast.

Selgitatakse järgmist sisu.

  • os.getcwd(),__file__
  • Hangib hetkel täidetava faili nime ja kataloogi nime.
  • Saab täidetava faili absoluutse tee.
  • Loeb teisi faile vastavalt hetkel täidetava faili asukohale.
  • Praeguse kataloogi viimine täidetava faili kataloogi.
  • Sama töötlemist saab teha sõltumata praegusest kataloogist töö ajal.

Teavet praeguse kataloogi (töökataloogi) saamise ja muutmise kohta leiate järgmisest artiklist.

Pange tähele, et __file__ ei saa kasutada Jupyter Notebookis (.ipynb).
Kataloog, kus .ipynb asub, käivitatakse praeguse kataloogina, sõltumata kataloogist, kus Jupyter Notebook on käivitatud.
Praeguse kataloogi muutmiseks on võimalik kasutada koodis os.chdir().

os.getcwd() ja __file__.

Windowsis saate praeguse kataloogi kontrollimiseks kasutada pwd asemel käsku dir.

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

Looge Pythoni skriptifail (file_path.py), mille sisu on madalamal tasemel (data\src) järgmine.

import os

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

Käivita käsk python (või mõnes keskkonnas käsk python3), määrates skriptifaili tee.

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

Absoluutse tee praegusesse kataloogi saab kätte os.getcwd() abil. Te võite kasutada ka __file__, et saada python3 käsuga määratud tee.

Kuni Python 3.8-ni sisaldab __file__ käsus python (või python3) määratud teekonda. Ülaltoodud näites tagastatakse suhteline tee, sest see on suhteline, kuid absoluutne tee tagastatakse, kui see on absoluutne.

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 ja uuemad versioonid tagastavad absoluutse tee __file__, sõltumata pythoni (või python3) käsus määratud teest.

Järgnevas näites lisame koodi samasse Python 3.7 skriptifaili (file_path.py) ja käivitame selle ülaltoodud kataloogi suhtes.

Python 3.7-s kasutatakse absoluutset teed. Tulemused on esitatud selle jaotise lõpus.

Hangib hetkel täidetava faili nime ja kataloogi nime.

Käimasoleva faili faili nime ja kataloogi nime saamiseks kasutage standardraamatukogu os.path mooduli järgmist funktsiooni.

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

Täitmise tulemus.

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

Saab täidetava faili absoluutse tee.

Kui suhteline tee saadakse __file__ abil, saab selle teisendada absoluutseks teeks os.path.abspath() abil. Katalooge saab saada ka absoluutse teena.

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

Täitmise tulemus.

# 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

Kui os.path.abspath() funktsioonis on määratud absoluutne tee, tagastatakse see sellisena, nagu ta on. Seega, kui __file__ on absoluutne tee, ei põhjusta järgmine tegevus viga.

  • os.path.abspath(__file__)

Loeb teisi faile vastavalt hetkel täidetava faili asukohale.

Kui soovite lugeda teisi faile lähtuvalt täidetava faili asukohast (teekonnast), ühendage järgmised kaks faili, kasutades funktsiooni os.path.join().

  • Käivitatava faili kataloog
  • Suhteline tee jooksvast failist loetava faili juurde.

Kui soovite lugeda faili, mis asub samas kataloogis kui käivitatav fail, ühendage lihtsalt faili nimi.

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

Täitmise tulemus.

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

Ülemist tasandit esindab “. \”. Võite jätta selle nii, nagu see on, kuid te võite kasutada os.path.normpath(), et normaliseerida tee ja eemaldada üleliigsed “. \” ja muud märgid.

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

Täitmise tulemus.

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

Praeguse kataloogi viimine täidetava faili kataloogi.

Kasutage funktsiooni os.chdir(), et viia praegune kataloog skriptis täidetava faili kataloogi.

Näete, et seda liigutab os.getcwd().

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

Täitmise tulemus.

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

Kui praegune kataloog on viidud, ei ole vaja seda faili lugemisel ühendada jooksva faili kataloogiga. Saate lihtsalt määrata tee suhtelise tee jooksva faili kataloogi suhtes.

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

Täitmise tulemus.

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

Sama töötlemist saab teha sõltumata praegusest kataloogist töö ajal.

Nagu me näitasime, on võimalik laadida faile skriptifaili asukoha alusel, sõltumata jooksva kataloogi asukohast täitmise ajal, kasutades ühte järgmistest meetoditest.

  • Ühendage käimasoleva faili kataloog ja käimasolevast failist loetava faili suhteline tee, kasutades os.path.join().
  • Praeguse kataloogi viimine täidetava faili kataloogi.

Praegust kataloogi on lihtsam teisaldada, kuid kui soovite pärast seda veel faile lugeda või kirjutada, peate muidugi arvestama, et praegune kataloog on teisaldatud.

Eelmiste näidete tulemused on kokkuvõtlikult esitatud allpool.

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

Absoluutse tee määramise tulemus on järgmine.

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

Praeguse kataloogi teisaldamise tulemus terminalis ja sama skriptifaili täitmine on näidatud allpool. Näete, et sama faili saab lugeda isegi siis, kui seda täidetakse teisest asukohast.

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