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!