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.

2voto

Survi Points 33

Pas sûr si cela fonctionne partout.

J'utilise ipython sous ubuntu.

Si vous voulez lire un fichier dans le sous-répertoire du dossier actuel :

/dossier-actuel/sous-repertoire/data.csv

votre script est dans le dossier actuel essayez simplement ceci:

import pandas as pd
chemin = './sous-repertoire/data.csv'
pd.read_csv(chemin)

2voto

James Wong Points 3

Obtenez le chemin du dossier parent, puis os.join vos fichiers relatifs à la fin.

# obtenir le dossier parent avec `os.path`
import os.path

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# maintenant utilisez BASE_DIR pour obtenir un fichier relatif au script actuel
os.path.join(BASE_DIR, "config.yaml")

La même chose avec pathlib:

# obtenir le dossier parent avec `pathlib`'s Path
from pathlib import Path

BASE_DIR = Path(__file__).absolute().parent

# maintenant utilisez BASE_DIR pour obtenir un fichier relatif au script actuel
BASE_DIR / "config.yaml"

0 votes

Tous les noms en majuscules doivent être réservés pour les constantes

0 votes

Dans ce cas, BASE_DIR ne serait-il pas une constante ? Le dossier parent du script en cours d'exécution ne changera pas pendant l'exécution.

1voto

Chidhvilas Points 55

Lorsque j'étais débutant, j'ai trouvé ces descriptions un peu intimidantes. Comme au début j'essaierais Pour Windows

f= open('C:\Users\chidu\Desktop\Skipper New\Special_Note.txt','w+') 
print(f) 

et cela provoquerait une erreur de syntaxe. J'étais beaucoup confus. Puis après avoir surfé un peu sur Google, j'ai trouvé pourquoi l'erreur s'était produite. J'écris ceci pour les débutants

C'est parce que pour que le chemin soit lu en Unicode, il suffit d'ajouter un \ au début du chemin du fichier

f= open('C:\\Users\chidu\Desktop\Skipper New\Special_Note.txt','w+') 
print(f) 

Et maintenant ça fonctionne, il suffit d'ajouter \ avant de commencer le répertoire.

1 votes

Les barres obliques inverses sont des caractères d'échappement pour plusieurs caractères. Si jamais vous tombez sur \t comme par exemple \top\directory, alors '\t' est interprété comme un caractère de tabulation et votre 'astuce' échoue. La meilleure option est d'utiliser le format de chaîne brute r'C:\Users\chidu\Desktop\Skipper New\Special_Note.txt' qui ne tente pas d'échapper les caractères.

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