Disons que vous avez un module qui contient
myfile = open('test.txt', 'r')
Et 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 ce code.
Alors, comment faire en premier les fichiers de recherche de modules avec des chemins relatifs dans le même dossier?
Il existe différentes solutions en utilisant "__file__
" Ou "os.getcwd()
", mais j'espère qu'il existe une méthode plus propre, comme le même caractère spécial dans la chaîne que vous passez pour ouvrir () ou fichier ().
La solution consiste à utiliser __file__
et c'est assez propre:
import os
TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')
Pour les modules normaux chargés à partir de .py
fichiers, les __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
interfaces disponibles depuis 2014:
from pathlib import Path
here = Path(__file__).parent
with (here/'test.txt').open() as myfile:
...
pathlib
a été ajouté à Python dans 3.4 - voir PEP428 . Pour les utilisateurs toujours sur Python 2.7 souhaitant utiliser les mêmes API, un le backport est disponible .
Les utilisateurs intéressés à appliquer les approches les plus modernes disponibles devraient envisager de passer à importlib-resources plutôt que de joindre des fichiers de données relatifs à l'arborescence source. Actuellement, peu d'utilisateurs ont le luxe de restreindre la compatibilité à Python 3.7+ uniquement, donc je mentionne cela comme un avertissement à ceux qui aiment être à la pointe de la technologie.