web-dev-qa-db-fra.com

Ouvrir le fichier dans un emplacement relatif dans Python

Supposons que le code python soit exécuté de manière inconnue dans le répertoire Windows précédent, par exemple, et que chaque fois que le code est installé, il doit accéder au répertoire 'main/2091/data.txt'.

comment utiliser la fonction open (location)? quel devrait être l'emplacement?

Modifier :

J'ai trouvé que le code simple ci-dessous fonctionnera .. a-t-il des inconvénients?

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

Avec ce type de choses, vous devez faire attention à votre répertoire de travail actuel. Par exemple, vous ne pouvez pas exécuter le script à partir du 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 certain que le fichier souhaité se trouve dans un sous-répertoire situé en dessous du script, vous pouvez utiliser __file__ pour vous aider. __file__ est le chemin d'accès complet à l'emplacement du script que vous exécutez.

Donc, vous pouvez jouer avec 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)
155
Russ

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)
28
Fahad Haleem

J'ai créé un compte afin de pouvoir clarifier un écart que je pense avoir trouvé dans la réponse originale de Russ.

Pour référence, sa réponse initiale é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 il essaie de créer de manière dynamique un chemin système absolu vers le fichier souhaité.

Cory Mawhorter a remarqué que __file__ est un chemin relatif (il l'est aussi 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 je l'ai finalement fait fonctionner), vous devez supprimer le nom du script à 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 résultant abs_file_path (dans cet exemple) devient: /path/to/dir/2091/data.txt

21
Grant Hulegaard

Cela dépend du système d'exploitation que vous utilisez. Si vous souhaitez une solution compatible avec Windows et * nix, par exemple:

from os import path

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

devrait bien fonctionner.

Le module path peut formater un chemin pour le système d'exploitation sur lequel il s'exécute. De plus, python gère parfaitement les chemins relatifs, tant que vous disposez des autorisations appropriées.

Éditer :

Comme mentionné par kindall dans les commentaires, python peut quand même convertir entre les chemins de type Unix et Windows, donc un code encore plus simple fonctionnera:

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

Cela étant dit, le path module a encore des fonctions utiles.

17
Wilduck

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:

Bibliothèque d'importation:

import os

Utilisez __file__ pour atteindre le chemin du script actuel:

script_path = os.path.abspath(__file__)

Sépare le chemin du script en plusieurs éléments:

path_list = script_path.split(os.sep)

Supprimez le dernier élément de la liste (le fichier de script réel):

script_directory = path_list[0:len(path_list)-1]

Ajoutez le chemin du fichier relatif:

rel_path = "main/2091/data.txt

Rejoignez les éléments de la liste et ajoutez le fichier du chemin relatif:

path = "/".join(script_directory) + "/" + rel_path

Vous êtes maintenant prêt à faire ce que vous voulez avec le fichier, comme par exemple:

file = open(path)
7
Patriots299

Je passe beaucoup de temps à découvrir pourquoi mon code n'a pas pu trouver mon fichier s'exécutant Python 3 sur le système Windows. Alors j'ai 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')
7
Ângelo Polotto

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

3
Olivia Liao

Essaye ça:

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 traiter les fichiers et les chemins, appelée pathlib. Ça marche pour moi!

3
dcampos

Je ne sais pas si cela fonctionne partout.

J'utilise ipython dans Ubuntu.

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

/current-folder/sub-directory/data.csv

votre script est dans le dossier en cours, essayez ceci:

import pandas as pd
path = './sub-directory/data.csv'
pd.read_csv(path)
2
Survi

Python passe 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 tels que main/2091/data.txt (conseil: oui), cela fonctionnera correctement.

Vous constaterez peut-être que le meilleur moyen de répondre à une question comme celle-ci est de l'essayer et de voir ce qui se passe.

1
kindall