Code:
import os
script_path = os.path.abspath(__file__)
path_list = script_path.split(os.sep)
script_directory = path_list[0:len(path_list)-1]
rel_path = "main/2091/data.txt"
path = "/".join(script_directory) + "/" + rel_path
Explication:
Importer la bibliothèque:
import os
Utiliser __file__
pour obtenir le chemin du script actuel:
script_path = os.path.abspath(__file__)
Séparer le chemin du script en plusieurs éléments:
path_list = script_path.split(os.sep)
Supprimer le dernier élément de la liste (le fichier de script réel):
script_directory = path_list[0:len(path_list)-1]
Ajouter le chemin du fichier relatif:
rel_path = "main/2091/data.txt
Joindre les éléments de la liste, et ajouter le fichier du chemin relatif:
path = "/".join(script_directory) + "/" + rel_path
Maintenant vous êtes prêt à faire ce que vous voulez avec le fichier, par exemple:
file = open(path)
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')