154 votes

Ouvrir un fichier dans un emplacement relatif en Python

Supposons que le code python soit exécuté dans un répertoire inconnu de Windows, par exemple 'main', et que, quel que soit l'endroit où le code est installé, lorsqu'il s'exécute, il doit accéder au répertoire 'main/2091/data.txt'.

comment utiliser la fonction open(location) ? quelle doit être la localisation ?

Edit :

J'ai découvert que le code simple ci-dessous fonctionne présente-t-il des inconvénients ?

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

217voto

Russ Points 2357

Avec ce type de chose, vous devez faire attention à ce que votre répertoire de travail réel est. Par exemple, vous ne pouvez pas exécuter le script depuis le répertoire dans lequel se trouve le fichier. Dans ce cas, vous ne pouvez pas simplement utiliser un chemin relatif par lui-même.

Si vous êtes sûr que le fichier que vous voulez est dans un sous-répertoire en dessous de celui où se trouve le script, vous pouvez utiliser __file__ pour vous aider ici. __file__ est le chemin complet où se trouve le script que vous exécutez.

Vous pouvez donc bricoler quelque chose comme ça :

import os
script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

43voto

Fahad Haleem Points 591

Ce code fonctionne bien :

import os

def readFile(filename):
    filehandle = open(filename)
    print filehandle.read()
    filehandle.close()

fileDir = os.path.dirname(os.path.realpath('__file__'))
print fileDir

#For accessing the file in the same folder
filename = "same.txt"
readFile(filename)

#For accessing the file in a folder contained in the current folder
filename = os.path.join(fileDir, 'Folder1.1/same.txt')
readFile(filename)

#For accessing the file in the parent folder of the current folder
filename = os.path.join(fileDir, '../same.txt')
readFile(filename)

#For accessing the file inside a sibling folder.
filename = os.path.join(fileDir, '../Folder2/same.txt')
filename = os.path.abspath(os.path.realpath(filename))
print filename
readFile(filename)

29voto

Grant Hulegaard Points 536

J'ai créé un compte juste pour pouvoir clarifier une anomalie que je pense avoir trouvée dans la réponse originale de Russ.

Pour mémoire, 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 tente de créer dynamiquement un chemin d'accès absolu au fichier souhaité.

Cory Mawhorter a remarqué que __file__ est un chemin relatif (c'est également le cas sur mon système) et a suggéré l'utilisation de os.path.abspath(__file__) . os.path.abspath renvoie toutefois le chemin absolu de votre script actuel (c.-à-d. /path/to/dir/foobar.py )

Pour utiliser cette méthode (et comment j'ai fini par la faire fonctionner), vous devez enlever le nom script de la fin du chemin :

import os
script_path = os.path.abspath(__file__) # i.e. /path/to/dir/foobar.py
script_dir = os.path.split(script_path)[0] #i.e. /path/to/dir/
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

Le chemin d'accès abs_file_path résultant (dans cet exemple) devient : /path/to/dir/2091/data.txt

20voto

Ângelo Polotto Points 562

J'ai passé beaucoup de temps à découvrir pourquoi mon code ne pouvait pas trouver mon fichier en utilisant Python 3 sur le système Windows. J'ai donc ajouté . avant / et tout a bien fonctionné :

import os

script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, './output03.txt')
print(file_path)
fptr = open(file_path, 'w')

19voto

Wilduck Points 5116

Cela dépend du système d'exploitation que vous utilisez. Si vous voulez une solution compatible à la fois avec Windows et *nix, quelque chose comme :

from os import path

file_path = path.relpath("2091/data.txt")
with open(file_path) as f:
    <do stuff>

devrait fonctionner correctement.

Le site path est capable de formater un chemin pour le système d'exploitation sur lequel il fonctionne. De plus, python gère très bien les chemins relatifs, pour autant que vous disposiez des permissions correctes.

Modifier :

Comme l'a mentionné kindall dans les commentaires, python peut de toute façon convertir les chemins d'accès de style unix en chemins d'accès de style Windows, de sorte que même un code plus simple fonctionnera :

with open("2091/data/txt") as f:
    <do stuff>

Ceci étant dit, le path module a encore quelques fonctions utiles.

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