85 votes

Comment créer un chemin de fichier "toujours relatif au module actuel" ?

Supposons que vous ayez un module qui contient

myfile = open('test.txt', 'r')

Le fichier 'test.txt' se trouve dans le même dossier. Si vous exécutez le module, le fichier sera ouvert avec succès.

Supposons maintenant que vous importiez ce module à partir d'un autre qui se trouve dans un autre dossier. Le fichier ne sera pas recherché dans le même dossier que le module où se trouve le code.

Comment faire en sorte que le module recherche d'abord les fichiers avec des chemins relatifs dans le même dossier ?

Il existe plusieurs solutions en utilisant " __file__ " ou " os.getcwd() "mais j'espère qu'il y a un moyen plus propre, comme le même caractère spécial dans la chaîne que vous passez à open() ou file().

104voto

yak Points 3938

La solution consiste à utiliser __file__ et c'est assez propre :

import os

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')

42voto

wim Points 35274

Pour les modules normaux chargés à partir de .py les fichiers __file__ doit être présent et utilisable. Pour joindre les informations de __file__ sur votre chemin relatif, il existe une option plus récente que os.path disponibles depuis 2014 :

from pathlib import Path

here = Path(__file__).parent
fname = here / "test.txt"
with fname.open() as f:
    ...

pathlib a été ajouté à Python en 3.4 - voir PEP428 . Pour les utilisateurs de Python 2.7 qui souhaitent utiliser les mêmes API, un fichier Le backport est disponible .

Notez que lorsque vous travaillez avec un paquetage Python, il existe de meilleures approches pour la lecture des ressources - vous pouvez envisager de passer à importlib-resources . Cela nécessite Python 3.7+, pour les versions plus anciennes vous pouvez utiliser pkgutil . L'un des avantages d'empaqueter correctement les ressources, plutôt que de joindre les fichiers de données par rapport à l'arbre source, est que le code fonctionnera toujours dans les cas où il n'est pas extrait sur un système de fichiers (par exemple, un paquet dans un fichier zip). Voir Comment lire un fichier (statique) à l'intérieur d'un paquetage Python ? pour plus de détails sur la lecture/écriture de fichiers de données dans un paquet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X