"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-07
Parcourir:361

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 présentation 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 :

from pathlib import Path

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

with path.open() as f:
    test = list(csv.reader(f))

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 :

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))

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

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3