J'ai créé un compte juste pour pouvoir clarifier une disparité que je pense avoir trouvée dans la réponse originale de Russ.
Pour référence, sa réponse originale était :
import os
script_dir = os.path.dirname(__file__)
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)
C'est une excellente réponse car elle essaie de créer de manière dynamique un chemin absolu vers le fichier souhaité.
Cory Mawhorter a remarqué que __file__
est un chemin relatif (c'est aussi le cas sur mon système) et a suggéré d'utiliser os.path.abspath(__file__)
. os.path.abspath
, cependant, renvoie le chemin absolu de votre script actuel (c'est-à-dire /path/to/dir/foobar.py
)
Pour utiliser cette méthode (et comment j'ai finalement réussi à le faire fonctionner), vous devez supprimer le nom du script à la fin du chemin :
import os
script_path = os.path.abspath(__file__) # c'est-à-dire /path/to/dir/foobar.py
script_dir = os.path.split(script_path)[0] # c'est-à-dire /path/to/dir/
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)
Le chemin absolu résultant (dans cet exemple) devient : /path/to/dir/2091/data.txt
3 votes
Vous utilisez des barres obliques non échappées. C'est un désavantage.
8 votes
Plusieurs inconvénients. 1) Comme le mentionne @orip, utilisez des barres obliques pour les chemins, même sous windows. Votre chaîne ne fonctionnera pas. Ou utilisez des chaînes brutes comme
r"\2091\sample.txt"
. Ou échappez-les comme"\\2091\\sample.txt"
(mais c'est ennuyeux). Aussi, 2) vous utilisez getcwd() qui est le chemin dans lequel vous étiez lorsque vous avez exécuté le script. Je pensais que vous vouliez relatif à l'emplacement du script (mais maintenant je me demande). Et 3), utilisez toujours les fonctionsos.path
pour manipuler les chemins. Votre ligne de jointure de chemin devrait êtreos.path.join(os.getcwd(), fichier)
4) le ; est inutile4 votes
Et pour bien faire... 5) utilisez des context guards pour garder votre code propre et éviter d'oublier de fermer votre fichier:
with open(path, 'r+') as fp:
. Voir ici pour la meilleure explication des instructionswith
que j'ai pu trouver.1 votes
À côté des soins nécessaires sur les barres obliques, comme indiqué précédemment, il y a la fonction
os.path.abspath
pour obtenir facilement le chemin complet du chemin relatif à ouvrir. L'instruction finale ressemble à ceci :os.path.abspath('./2091/sample.txt')