Para obter a localización (camiño) dun ficheiro de script en execución en Python, use __ficheiro__. Isto é útil para cargar outros ficheiros en función da situación do ficheiro en execución.
Ata Python 3.8, __ficheiro__ devolve a ruta especificada ao executar o comando python (ou comando python3 nalgúns ambientes). Se se especifica un camiño relativo, devólvese o camiño relativo; se se especifica un camiño absoluto, devólvese o camiño absoluto.
En Python 3.9 e posteriores, a ruta absoluta devólvese independentemente da ruta especificada no tempo de execución.
Explícanse os seguintes contidos.
os.getcwd()
,__file__
- Obter o nome do ficheiro e o nome do directorio do ficheiro en execución.
- Obter a ruta absoluta do ficheiro en execución.
- Le outros ficheiros en función da situación do ficheiro en execución.
- Move o directorio actual ao directorio do ficheiro que se está a executar.
- Pódese facer o mesmo procesamento independentemente do directorio actual en tempo de execución.
Vexa o seguinte artigo para obter información sobre como obter e cambiar o directorio actual (directorio de traballo).
- Artigos relacionados:Obter e cambiar (mover) o directorio actual en Python
Teña en conta que __ficheiro__ non se pode usar no caderno de Jupyter (.ipynb).
O directorio onde se atopa .ipynb executarase como o directorio actual, independentemente do directorio onde se inicie Jupyter Notebook.
É posible usar os.chdir () no código para cambiar o directorio actual.
- os.getcwd () e __ficheiro__.
- Obter o nome do ficheiro e o nome do directorio do ficheiro en execución.
- Obter a ruta absoluta do ficheiro en execución.
- Le outros ficheiros en función da situación do ficheiro en execución.
- Move o directorio actual ao directorio do ficheiro que se está a executar.
- Pódese facer o mesmo procesamento independentemente do directorio actual en tempo de execución.
os.getcwd () e __ficheiro__.
En Windows, pode usar o comando dir no canto de pwd para comprobar o directorio actual.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
Crea un ficheiro de script Python (file_path.py) co seguinte contido no nivel inferior (data \ src).
import os
print('getcwd: ', os.getcwd())
print('__file__: ', __file__)
Executa o comando python (ou comando python3 nalgúns ambientes) especificando a ruta ao ficheiro de script.
python3 data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: data/src/file_path.py
A ruta absoluta ao directorio actual pódese obter con os.getcwd (). Tamén pode usar __ficheiro__ para obter a ruta especificada polo comando python3.
Ata Python 3.8, __ficheiro conterá o camiño especificado no comando python (ou python3). No exemplo anterior, a ruta relativa devólvese porque é relativa, pero a ruta absoluta devólvese se é 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 e posteriores devolve a ruta absoluta a __ficheiro__, independentemente da ruta especificada no comando python (ou python3).
No seguinte exemplo, engadiremos o código ao mesmo ficheiro de script (file_path.py) en Python 3.7 e executarémolo en relación co directorio anterior.
En Python 3.7 úsase o camiño absoluto. Os resultados móstranse ao final desta sección.
Obter o nome do ficheiro e o nome do directorio do ficheiro en execución.
Para obter o nome do ficheiro e o nome do directorio do ficheiro en execución, use a seguinte función no módulo os.path da biblioteca estándar.
os.path.basename()
os.path.dirname()
print('basename: ', os.path.basename(__file__))
print('dirname: ', os.path.dirname(__file__))
Resultado da execución.
# basename: file_path.py
# dirname: data/src
Obter a ruta absoluta do ficheiro en execución.
Se se obtén un camiño relativo con __ficheiro__, pódese converter a un camiño absoluto con os.path.abspath (). Os directorios tamén se poden obter como camiños absolutos.
print('abspath: ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))
Resultado da execución.
# 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
Se se especifica un camiño absoluto en os.path.abspath (), devolverase tal cal. Polo tanto, se __ficheiro__ é un camiño absoluto, o seguinte non causará un erro.
os.path.abspath(__file__)
Le outros ficheiros en función da situación do ficheiro en execución.
Se desexa ler outros ficheiros en función da localización (ruta) do ficheiro que se está a executar, únase aos dous ficheiros seguintes usando os.path.join ().
- Directorio do ficheiro en execución
- Ruta relativa ao ficheiro que se vai ler desde o ficheiro en execución.
Se desexa ler un ficheiro no mesmo directorio que o ficheiro que está a executar, concatenar o nome do ficheiro.
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())
Resultado da execución.
# [set target path 1]
# target_path_1: data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
O nivel superior represéntase con “. \”. Podes deixalo como está, pero podes usar os.path.normpath () para normalizar o camiño e eliminar “. \” E outros caracteres adicionais.
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())
Resultado da execución.
# [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" !!
Move o directorio actual ao directorio do ficheiro que se está a executar.
Use os.chdir () para mover o directorio actual ao directorio do ficheiro que se está a executar no script.
- Artigos relacionados:Obter e cambiar (mover) o directorio actual en Python
Podes ver que o move os.getcwd ().
print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd: ', os.getcwd())
Resultado da execución.
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
Unha vez movido o directorio actual, non é necesario concatealo co directorio do ficheiro en execución ao ler o ficheiro. Só pode especificar a ruta relativa ao directorio do ficheiro en execución.
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())
Resultado da execución.
# [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" !!
Pódese facer o mesmo procesamento independentemente do directorio actual en tempo de execución.
Como demostramos, é posible cargar ficheiros en función da localización do ficheiro de script, independentemente do directorio actual en tempo de execución, empregando un dos seguintes métodos.
- Concatenar o directorio do ficheiro en execución e a ruta relativa ao ficheiro que se vai ler desde o ficheiro en execución usando os.path.join ().
- Move o directorio actual ao directorio do ficheiro que se está a executar.
É máis fácil mover o directorio actual, pero por suposto, se desexa ler ou escribir máis ficheiros, ten que ter en conta que o directorio actual foi movido.
Os resultados dos exemplos anteriores resúmense a continuació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" !!
O resultado de especificar o camiño absoluto é o seguinte.
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ón móstrase o resultado de mover o directorio actual no terminal e executar o mesmo ficheiro de script. Podes ver que se pode ler o mesmo ficheiro aínda que se execute desde unha situación diferente.
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" !!