Per obtenir la ubicació (camí d’accés) d’un fitxer de script en execució a Python, utilitzeu __fitxer__. Això és útil per carregar altres fitxers en funció de la ubicació del fitxer en execució.
Fins a Python 3.8, __file__ retorna el camí especificat en executar l’ordre python (o l’ordre python3 en alguns entorns). Si s’especifica un camí relatiu, es torna el camí relatiu; si s’especifica una ruta absoluta, es torna la ruta absoluta.
A Python 3.9 i versions posteriors, es torna el camí absolut independentment del camí especificat en temps d’execució.
S’expliquen els continguts següents.
os.getcwd()
,__file__
- Obteniu el nom del fitxer i el nom del directori del fitxer en execució actual.
- Obteniu el camí d’accés absolut del fitxer que s’està executant.
- Llegeix altres fitxers en funció de la ubicació del fitxer en execució actual.
- Moveu el directori actual al directori del fitxer que s’està executant.
- Es pot fer el mateix processament independentment del directori actual en temps d’execució.
Consulteu l’article següent per obtenir informació sobre com obtenir i canviar el directori actual (directori de treball).
- Articles relacionats:Obteniu i canvieu (moveu) el directori actual a Python
Tingueu en compte que __fitxer__ no es pot utilitzar al bloc de notes Jupyter (.ipynb).
El directori on es troba .ipynb s’executarà com a directori actual, independentment del directori on s’iniciï Jupyter Notebook.
És possible utilitzar os.chdir () al codi per canviar el directori actual.
- os.getcwd () i __fitxer__.
- Obteniu el nom del fitxer i el nom del directori del fitxer en execució actual.
- Obteniu el camí d’accés absolut del fitxer que s’està executant.
- Llegeix altres fitxers en funció de la ubicació del fitxer en execució actual.
- Moveu el directori actual al directori del fitxer que s’està executant.
- Es pot fer el mateix processament independentment del directori actual en temps d’execució.
os.getcwd () i __fitxer__.
Al Windows, podeu utilitzar l’ordre dir en lloc de pwd per comprovar el directori actual.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
Creeu un fitxer d’escriptura Python (file_path.py) amb el contingut següent al nivell inferior (data \ src).
import os
print('getcwd: ', os.getcwd())
print('__file__: ', __file__)
Executeu l’ordre python (o l’ordre python3 en alguns entorns) especificant el camí d’accés al fitxer script.
python3 data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: data/src/file_path.py
El camí absolut al directori actual es pot obtenir amb os.getcwd (). També podeu utilitzar __fitxer__ per obtenir el camí especificat per l’ordre python3.
Fins a Python 3.8, __file__ contindrà el camí especificat a l’ordre python (o python3). A l’exemple anterior, es retorna la ruta relativa perquè és relativa, però la ruta absoluta es torna si és absoluta.
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 i versions posteriors retorna el camí d’accés absolut a __fitxer__, independentment del camí especificat a l’ordre python (o python3).
A l’exemple següent, afegirem el codi al mateix fitxer de script (file_path.py) a Python 3.7 i l’executarem en relació amb el directori anterior.
A Python 3.7 s’utilitza la ruta absoluta. Els resultats es mostren al final d’aquesta secció.
Obteniu el nom del fitxer i el nom del directori del fitxer en execució actual.
Per obtenir el nom del fitxer i el nom del directori del fitxer en execució, utilitzeu la funció següent al mòdul os.path de la biblioteca estàndard.
os.path.basename()
os.path.dirname()
print('basename: ', os.path.basename(__file__))
print('dirname: ', os.path.dirname(__file__))
Resultat d’execució.
# basename: file_path.py
# dirname: data/src
Obteniu el camí d’accés absolut del fitxer que s’està executant.
Si s’obté un camí relatiu amb __fitxer__, es pot convertir en un camí absolut amb os.path.abspath (). Els directoris també es poden obtenir com a camins absoluts.
print('abspath: ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))
Resultat d’execució.
# 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
Si s’especifica un camí d’accés absolut a os.path.abspath (), es retornarà tal qual. Per tant, si __fitxer__ és un camí absolut, el següent no provocarà cap error.
os.path.abspath(__file__)
Llegeix altres fitxers en funció de la ubicació del fitxer en execució actual.
Si voleu llegir altres fitxers en funció de la ubicació (camí d’accés) del fitxer que s’està executant, uniu els dos fitxers següents mitjançant os.path.join ().
- Directori del fitxer en execució
- Camí relatiu al fitxer que es llegeix des del fitxer en execució.
Si voleu llegir un fitxer al mateix directori que el fitxer que esteu executant, concateneu el nom del fitxer.
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())
Resultat d’execució.
# [set target path 1]
# target_path_1: data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
El nivell superior es representa amb “. \”. Podeu deixar-lo tal com està, però podeu utilitzar os.path.normpath () per normalitzar el camí i eliminar “. \” I altres caràcters addicionals.
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())
Resultat d’execució.
# [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" !!
Moveu el directori actual al directori del fitxer que s’està executant.
Utilitzeu os.chdir () per moure el directori actual al directori del fitxer que s’està executant a l’script.
- Articles relacionats:Obteniu i canvieu (moveu) el directori actual a Python
Podeu veure que el mou os.getcwd ().
print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd: ', os.getcwd())
Resultat d’execució.
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
Un cop s’ha mogut el directori actual, no és necessari concatenar-lo amb el directori del fitxer en execució en llegir-lo. Només podeu especificar el camí relatiu al directori del fitxer en execució.
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())
Resultat d’execució.
# [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" !!
Es pot fer el mateix processament independentment del directori actual en temps d’execució.
Com hem demostrat, és possible carregar fitxers en funció de la ubicació del fitxer de script, independentment del directori actual en temps d’execució, mitjançant un dels mètodes següents.
- Concatenar el directori del fitxer en execució i el camí d’accés relatiu al fitxer que es llegirà des del fitxer en execució mitjançant os.path.join ().
- Moveu el directori actual al directori del fitxer que s’està executant.
És més fàcil moure el directori actual, però, per descomptat, si voleu llegir o escriure més fitxers després, heu de tenir en compte que el directori actual s’ha mogut.
Els resultats dels exemples anteriors es resumeixen a continuació.
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" !!
El resultat d’especificar la ruta absoluta és el següent.
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" !!
A continuació es mostra el resultat de moure el directori actual al terminal i executar el mateix fitxer de seqüència. Podeu veure que el mateix fitxer es pot llegir fins i tot si s’executa des d’una ubicació diferent.
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" !!