Acessando arquivos com caminhos relativos em projetos Python
Ao manipular arquivos em um projeto Python, caminhos relativos são frequentemente empregados por conveniência. No entanto, seu comportamento pode se tornar ambíguo, especialmente quando se trata de estruturas de projeto multinível.
Considere o seguinte layout de projeto:
project /data test.csv /package __init__.py module.py main.py
O módulo module.py tenta ler um arquivo em ../data/test.csv usando um caminho relativo, mas ao executar main.py, surge um erro indicando que o arquivo não foi encontrado. Essa aparente inconsistência decorre do fato de que o caminho relativo é resolvido de forma diferente dependendo de onde o script é executado.
No caso de __init__.py e module.py, o caminho é avaliado em relação ao diretório que os contém. arquivos. No entanto, para main.py, o caminho é relativo à sua própria localização.
Resolvendo a ambigüidade do caminho
Para resolver essa ambigüidade, caminhos absolutos podem ser usados. Alternativamente, uma abordagem mais elegante é utilizar o atributo __file__ do Python:
from pathlib import Path
path = Path(__file__).parent / "../data/test.csv"
with path.open() as f:
test = list(csv.reader(f))
Este truque depende do módulo pathlib 3.4 do Python e constrói um caminho absoluto com base na localização do script atual.
Suporte a versões mais antigas do Python.
Se as versões do Python abaixo de 3.4 ainda estiverem em uso, um método alternativo envolve a manipulação do atual caminho:
import csv
import os.path
my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/test.csv")
with open(path) as f:
test = list(csv.reader(f))
Esta abordagem combina funções os.path para obter o mesmo resultado que o método baseado em pathlib.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3