J'ai un fichier python, converti à partir d'un notebook Jupiter, et il y a un sous-dossier appelé `` datasets '' dans ce dossier de fichiers. Lorsque j'essaie d'ouvrir un fichier qui se trouve dans ce dossier `` datasets '', avec ce code:
os.getcwd()
Il dit qu'il n'y a pas de tel fichier ou dossier. Puis j'ajoute cette ligne
import pandas as pd # Load the CSV data into DataFrames super_bowls = pd.read_csv('/datasets/super_bowls.csv')
Et la sortie est le dossier de niveau supérieur du projet, et non le sous-dossier quand se trouve ce fichier python. Et je pense que c'est peut-être la raison pour laquelle cela ne fonctionne pas.
Alors, comment puis-je ouvrir ce fichier csv avec des chemins relatifs? Je ne veux pas utiliser de chemin absolu car ce code va être utilisé dans un autre ordinateur.
Pourquoi os.getcwd () n'obtient pas le chemin réel du dossier?
6 Réponses :
(édité)
Selon votre commentaire ci-dessous, le répertoire de travail actuel est
/Users/ivanparra/AprendizajePython/
pendant que le fichier est dans
/Users/ivanparra/AprendizajePython/Jupyter/datasets/super_bowls.csv
Pour cette raison, accéder au sous-dossier des datasets
du répertoire de travail actuel (CWD) vous amène à /Users/ivanparra/AprendizajePython/datasets
qui n'existe pas ou ne contient pas le fichier que vous recherchez.
Vous pouvez faire l'une des deux choses suivantes:
(1) Utilisez un chemin absolu vers le fichier, comme dans
super_bowls = pd.read_csv("/Users/ivanparra/AprendizajePython/Jupyter/datasets/super_bowls.csv")
(2) utiliser le bon chemin relatif, comme dans
super_bowls = pd.read_csv("./Jupyter/datasets/super_bowls.csv")
Il y a aussi (3) - utilisez os.path.join
pour contacter le CWD vers le chemin relatif - c'est fondamentalement le même que (2). (vous pouvez aussi utiliser
J'ai fait ça, j'ai mis le point avant la barre oblique, mais ça ne marche pas.
@IvanParra pourriez-vous s'il vous plaît ajouter l'emplacement réel du fichier et le répertoire de travail actuel à la question?
Oui, l'emplacement réel du fichier principal .py est "/Users/ivanparra/AprendizajePython/Jupyter"
et à l'intérieur de ce dossier se trouve un sous /datasets/
dossier /datasets/
, où se trouve le fichier csv.
@IvanParra pourriez-vous s'il vous plaît imprimer le résultat de os.getcwd () et le poster ici?
Oui. /Users/ivanparra/AprendizajePython/
Essayez ce code
super_bowls = pd.read_csv( os.getcwd() + '/datasets/super_bowls.csv')
Ça marche, merci. Mais le point de tout cela est que ce code sera dans un autre ordinateur, et peut-être que la structure des fichiers y sera différente. Comment puis-je obtenir le chemin relatif du fichier actuel et non celui où python fonctionne?
Mon observation, la notation point (.) Pour passer au répertoire parent ne fonctionne parfois pas selon le système d'exploitation. Ce que je fais généralement pour le rendre indépendant du système d'exploitation, c'est ceci:
import pandas as pd import os __location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) super_bowls = pd.read_csv(__location__ + '/datasets/super_bowls.csv')
Cela fonctionne aussi bien sur mes fenêtres que sur ma machine ubantu. Je ne sais pas s’il existe d’autres moyens plus efficaces pour y parvenir. Voudrais savoir s'il y en a.
Merci beaucoup. J'ai beaucoup aidé! En recherchant plus sur ces modules OS, j'obtiens une version plus courte pour fonctionner. import pandas as pd import os currentPath = os.path.dirname(__file__) super_bowls = pd. read.csv(currentPath + '/datasets/super_bowls.csv')
Merci à tous ceux qui ont essayé de m'aider. Grâce à la réponse Roy2012, j'ai obtenu un code qui fonctionne pour moi.
'/Users/ivanparra/AprendizajePython/Jupyter'
Le os.path.dirname me donne le chemin du fichier courant et me permet de travailler avec des chemins relatifs.
import pandas as pd import os currentPath = os.path.dirname(__file__) # Load the CSV data into DataFrames super_bowls = pd.read_csv(currentPath + '/datasets/super_bowls.csv')
et avec ça ça marche comme un charme !!
PS: En remarque, le comportement de os.getcwd () est assez différent dans un Jupyter Notebook d'un fichier python. À l'intérieur du cahier, cette fonction donne le chemin du fichier actuel, mais dans un fichier python, donne le chemin du dossier supérieur.
J'ai remarqué ce problème il y a quelques années. Je pense que c'est une question de style de conception. Le problème est que: votre dossier d'espace de travail est juste un dossier, pas un dossier de projet. La plupart du temps, votre référence relative est basée sur le fichier actuel.
VSCode prend en charge le paramètre dynamique de cwd, mais ce n'est pas la valeur par défaut. Si votre dossier de travail n'est pas un projet rigoureux et professionnel, je vous recommande d'ajouter les paramètres suivants à launch.json
. C'est la réponse la plus simple dont vous avez besoin.
"cwd": "${fileDirname}"
Pouvez-vous m'expliquer ce que vous entendez par un simple dossier et non par un dossier de projet? Je me suis perdu avec cette référence.
La réponse réside vraiment dans la réponse de user2357112: os.getcwd () fonctionne très bien. Le problème réside dans vos attentes. Le répertoire de travail actuel est le répertoire dans lequel Python s'exécute, pas le répertoire d'un fichier source particulier. - user2357112 soutient Monica le 22 mai à 6h03
La solution est:
data_dir = os.path.dirname(__file__)
Que voyez-vous lorsque vous tapez
pwd
sur la cellule Jupyter?os.getcwd()
fonctionneos.getcwd()
. Le problème réside dans vos attentes. Le répertoire de travail actuel est le répertoire dans lequel Python s'exécute, pas le répertoire d'un fichier source particulier.La chose curieuse est que dans mon cahier Jupiter j'ai
pd.read_csv('datasets/super_bowls.csv')
et cela fonctionne comme un charme. Mais lorsque j'exécute du code sur un fichier .py direct, ce n'est pas le cas.Lorsque je tape pwd, cela me donne le dossier de niveau supérieur. La structure que j'ai est "/ Users / ivanparra / AprendizajePython / jupyter / datasets". Le fichier principal se trouve dans le dossier Jupyter et le csv dans le sous-dossier des ensembles de données.
Si le fichier python fait partie d'un package lors de son exécution, le répertoire de travail actuel sera le dossier dans lequel se trouve le premier fichier dunder init. Mais si vous exécutez un module directement sans son package, ce répertoire de travail sera l'emplacement du fichier python.