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+');
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)
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)
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
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.
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)
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')
Si le fichier est dans votre dossier parent, par exemple. follower.txt, vous pouvez simplement utiliser open('../follower.txt', 'r').read()
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!
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)
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.