"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que caminhos relativos em projetos Python levam a erros de arquivo não encontrado?

Por que caminhos relativos em projetos Python levam a erros de arquivo não encontrado?

Publicado em 2024-11-07
Navegar:381

Why Do Relative Paths in Python Projects Lead to File Not Found Errors?

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.

Tutorial mais recente Mais>

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