190 votes

Ouvrir un fichier dans un emplacement relatif en Python

Suppose my python code is executed a directory called principal and the application needs to access principal/2091/data.txt.

how should I use open(location)? what should the parameter location be?

I found that below simple code will work.. does it have any disadvantages?

fichier = "\2091\sample.txt"
chemin = os.getcwd()+fichier
fp = open(chemin, 'r+');

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 fonctions os.path pour manipuler les chemins. Votre ligne de jointure de chemin devrait être os.path.join(os.getcwd(), fichier) 4) le ; est inutile

4 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 instructions with que j'ai pu trouver.

12voto

dcampos Points 71

Essayer ceci :

from pathlib import Path

data_folder = Path("/relative/path")
file_to_open = data_folder / "file.pdf"

f = open(file_to_open)

print(f.read())

Python 3.4 a introduit une nouvelle bibliothèque standard pour manipuler les fichiers et les chemins appelée pathlib. Ça fonctionne pour moi !

0 votes

Veuillez utiliser with data_folder.open() as f à la place

7voto

Patriots299 Points 355

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)

1 votes

Au lieu de path = "/".join(script_directory) + "/" + rel_path vous devriez utiliser le module os comme dans path = os.path.join(script_directory, rel_path). Au lieu de parser manuellement le chemin, vous devriez utiliser script_path = os.path.dirname(__file__).

4voto

Webucator Points 808
import os
def file_path(relative_path):
    dir = os.path.dirname(os.path.abspath(__file__))
    split_path = relative_path.split("/")
    new_path = os.path.join(dir, *split_path)
    return new_path

with open(file_path("2091/data.txt"), "w") as f:
    f.write("Puissant vous êtes devenu.")

3voto

Olivia Liao Points 337

Si le fichier se trouve dans votre dossier parent, par exemple follower.txt, vous pouvez simplement utiliser open('../follower.txt', 'r').read()

2voto

kindall Points 60645

Python transmet simplement le nom de fichier que vous lui donnez au système d'exploitation, qui l'ouvre. Si votre système d'exploitation prend en charge les chemins relatifs comme main/2091/data.txt (astuce : c'est le cas), alors cela fonctionnera bien.

Vous pouvez constater que la façon la plus simple de répondre à une question comme celle-ci est de l'essayer et de voir ce qui se passe.

2 votes

Pas vrai... le répertoire de travail à l'intérieur d'un script est l'emplacement à partir duquel vous avez exécuté le script, pas l'emplacement du script. Si vous exécutez le script ailleurs (peut-être que le script se trouve dans votre chemin système), le chemin relatif vers le sous-répertoire ne fonctionnera pas. Veuillez consulter ma réponse sur comment contourner cela.

0 votes

@Russ - l'exemple de l'OP utilise getcwd(). J'ai lu la description originale comme "relatif à l'endroit où j'exécute le script, peu importe où se trouve le code".

0 votes

@orip - L'OP a ajouté l'appel à getcwd() 3 heures après la question. Peu importe... passons à autre chose. :)

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