Käynnissä olevan tiedoston sijainnin (polun) saaminen Pythonissa: __file__.

liiketoiminta

Pythonissa käynnissä olevan komentosarjatiedoston sijainnin (polun) saa käyttämällä __file__. Tästä on hyötyä ladattaessa muita tiedostoja käynnissä olevan tiedoston sijainnin perusteella.

Python 3.8:aan asti __file__ palauttaa python-komennon (tai joissakin ympäristöissä python3-komennon) suorittamisen yhteydessä määritetyn polun. Jos määritetään suhteellinen polku, palautetaan suhteellinen polku; jos määritetään absoluuttinen polku, palautetaan absoluuttinen polku.

Python 3.9:ssä ja uudemmissa versioissa absoluuttinen polku palautetaan riippumatta suoritusaikana määritetystä polusta.

Seuraava sisältö selitetään.

  • os.getcwd(),__file__
  • Hae parhaillaan suoritettavan tiedoston nimi ja hakemiston nimi.
  • Hae suoritettavan tiedoston absoluuttinen polku.
  • Lukee muita tiedostoja parhaillaan suoritettavan tiedoston sijainnin perusteella.
  • Siirrä nykyinen hakemisto suoritettavan tiedoston hakemistoon.
  • Sama käsittely voidaan suorittaa nykyisestä hakemistosta riippumatta suoritusaikana.

Seuraavassa artikkelissa on tietoja nykyisen hakemiston (työhakemiston) hakemisesta ja vaihtamisesta.

Huomaa, että __file__ ei voi käyttää Jupyter Notebookissa (.ipynb).
Hakemisto, jossa .ipynb sijaitsee, suoritetaan nykyisenä hakemistona riippumatta siitä, mistä hakemistosta Jupyter Notebook on käynnistetty.
Koodissa on mahdollista käyttää komentoa os.chdir() nykyisen hakemiston vaihtamiseksi.

os.getcwd() ja __file__.

Windowsissa voit käyttää dir-komentoa pwd:n sijasta nykyisen hakemiston tarkistamiseen.

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

Luo Python-skriptitiedosto (file_path.py), jonka sisältö on seuraava alemmalla tasolla (data\src).

import os

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

Suorita python-komento (tai python3-komento joissakin ympäristöissä) määrittämällä skriptitiedoston polku.

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

Absoluuttinen polku nykyiseen hakemistoon saadaan komennolla os.getcwd(). Voit myös käyttää __file__ saadaksesi python3-komennon määrittämän polun.

Python 3.8:aan asti __file__ sisältää python (tai python3) -komennossa määritetyn polun. Yllä olevassa esimerkissä palautetaan suhteellinen polku, koska se on suhteellinen, mutta absoluuttinen polku, jos se on absoluuttinen.

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 uudemmat versiot palauttavat __file__:n absoluuttisen polun riippumatta python (tai python3) -komennossa määritetystä polusta.

Seuraavassa esimerkissä lisäämme koodin samaan skriptitiedostoon (file_path.py) Python 3.7:ssä ja suoritamme sen suhteessa edellä mainittuun hakemistoon.

Python 3.7:ssä käytetään absoluuttista polkua. Tulokset esitetään tämän jakson lopussa.

Hae parhaillaan suoritettavan tiedoston nimi ja hakemiston nimi.

Voit saada käynnissä olevan tiedoston nimen ja hakemiston nimen käyttämällä standardikirjaston os.path-moduulin seuraavaa funktiota.

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

Suorituksen tulos.

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

Hae suoritettavan tiedoston absoluuttinen polku.

Jos suhteellinen polku saadaan __file__:llä, se voidaan muuntaa absoluuttiseksi poluksi komennolla os.path.abspath(). Hakemistot voidaan saada myös absoluuttisina polkuina.

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

Suorituksen tulos.

# 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

Jos absoluuttinen polku on määritetty os.path.abspath()-kentässä, se palautetaan sellaisenaan. Jos siis __file__ on absoluuttinen polku, seuraava ei aiheuta virhettä.

  • os.path.abspath(__file__)

Lukee muita tiedostoja parhaillaan suoritettavan tiedoston sijainnin perusteella.

Jos haluat lukea muita tiedostoja suoritettavan tiedoston sijainnin (polun) perusteella, yhdistä seuraavat kaksi tiedostoa käyttämällä os.path.join().

  • Suoritettavan tiedoston hakemisto
  • Suhteellinen polku tiedostoon, joka luetaan käynnissä olevasta tiedostosta.

Jos haluat lukea tiedoston, joka on samassa hakemistossa kuin ajettava tiedosto, liitä tiedoston nimi yhteen.

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

Suorituksen tulos.

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

Ylempää tasoa edustaa ”. \”. Voit jättää sen ennalleen, mutta voit käyttää os.path.normpath() -ohjelmaa normalisoimaan polun ja poistamaan ylimääräiset ”. \” ja muut merkit.

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

Suorituksen tulos.

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

Siirrä nykyinen hakemisto suoritettavan tiedoston hakemistoon.

Käytä komentoa os.chdir() siirtääksesi nykyisen hakemiston komentosarjassa suoritettavan tiedoston hakemistoon.

Näet, että se on siirretty os.getcwd():n avulla.

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

Suorituksen tulos.

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

Kun nykyinen hakemisto on siirretty, sitä ei tarvitse yhdistää käynnissä olevan tiedoston hakemistoon tiedostoa luettaessa. Voit vain määrittää polun suhteessa käynnissä olevan tiedoston hakemistoon.

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

Suorituksen tulos.

# [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 käsittely voidaan suorittaa nykyisestä hakemistosta riippumatta suoritusaikana.

Kuten olemme osoittaneet, on mahdollista ladata tiedostoja komentosarjatiedoston sijainnin perusteella, riippumatta nykyisestä hakemistosta suoritusaikana, käyttämällä jotakin seuraavista menetelmistä.

  • Yhdistä käynnissä olevan tiedoston hakemisto ja käynnissä olevasta tiedostosta luettavan tiedoston suhteellinen polku käyttämällä os.path.join().
  • Siirrä nykyinen hakemisto suoritettavan tiedoston hakemistoon.

Nykyisen hakemiston siirtäminen on helpompaa, mutta jos haluat lukea tai kirjoittaa lisää tiedostoja sen jälkeen, sinun on tietenkin otettava huomioon, että nykyinen hakemisto on siirretty.

Edellisten esimerkkien tulokset on esitetty tiivistetysti jäljempänä.

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

Absoluuttisen polun määrittämisen tulos on seuraava.

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

Tulos, joka saadaan, kun nykyinen hakemisto siirretään päätelaitteessa ja sama komentosarjatiedosto suoritetaan, näkyy alla. Näet, että sama tiedosto voidaan lukea, vaikka se suoritettaisiin eri paikasta.

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