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.
- Aiheeseen liittyvät artikkelit:Nykyisen hakemiston hakeminen ja muuttaminen (siirtäminen) Pythonissa
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__.
- 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.
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.
- Aiheeseen liittyvät artikkelit:Nykyisen hakemiston hakeminen ja muuttaminen (siirtäminen) Pythonissa
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" !!