Maison  >  Article  >  développement back-end  >  Pourquoi les chemins relatifs dans les projets Python entraînent-ils des erreurs de fichier introuvable ?

Pourquoi les chemins relatifs dans les projets Python entraînent-ils des erreurs de fichier introuvable ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 11:39:02508parcourir

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

Accès aux fichiers avec des chemins relatifs dans les projets Python

Lors de la manipulation de fichiers dans un projet Python, des chemins relatifs sont souvent utilisés pour plus de commodité. Cependant, leur comportement peut devenir ambigu, en particulier lorsqu'il s'agit de structures de projet à plusieurs niveaux.

Considérez la disposition de projet suivante :

project
    /data
        test.csv
    /package
        __init__.py
        module.py
    main.py

Module module.py tente de lire un fichier dans . ./data/test.csv en utilisant un chemin relatif, mais lors de l'exécution de main.py, une erreur survient indiquant que le fichier n'est pas trouvé. Cette incohérence apparente vient du fait que le chemin relatif est résolu différemment selon l'endroit où le script est exécuté.

Dans le cas de __init__.py et module.py, le chemin est évalué par rapport au répertoire contenant ces fichiers. Cependant, pour main.py, le chemin est relatif à son propre emplacement.

Résoudre l'ambiguïté du chemin

Pour résoudre cette ambiguïté, des chemins absolus peuvent être utilisés. Alternativement, une approche plus élégante consiste à utiliser l'attribut __file__ de Python :

<code class="python">from pathlib import Path

path = Path(__file__).parent / "../data/test.csv"

with path.open() as f:
    test = list(csv.reader(f))</code>

Cette astuce s'appuie sur le module pathlib 3.4 de Python et construit un chemin absolu basé sur l'emplacement du script actuel.

Prise en charge des anciennes versions de Python

Si les versions de Python inférieures à 3.4 sont toujours utilisées, une méthode alternative consiste à manipuler le chemin actuel :

<code class="python">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))</code>

Cette approche combine les fonctions os.path pour obtenir le même résultat que la méthode basée sur pathlib.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn