1
votes

Python os.getcwd () ne fonctionne pas sur les sous-dossiers dans VSCODE

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?


5 commentaires

Que voyez-vous lorsque vous tapez pwd sur la cellule Jupyter?


os.getcwd() fonctionne os.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.


6 Réponses :


1
votes

(é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


5 commentaires

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/



0
votes

Essayez ce code

super_bowls = pd.read_csv( os.getcwd() + '/datasets/super_bowls.csv')


1 commentaires

Ç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?



1
votes

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.


1 commentaires

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')



0
votes

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.


0 commentaires

0
votes

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}"


1 commentaires

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.



0
votes

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__)


0 commentaires