__file__n'est pas défini lorsque vous exécutez python en tant que shell interactif. Le premier morceau de code dans votre question semble provenir d'un shell interactif, mais produirait en fait un NameError, au moins sur python 2.7.3, mais d'autres aussi je suppose.
drevicko
Réponses:
1637
Python 3
Pour le répertoire du script en cours d'exécution:
Pour le répertoire du script en cours d'exécution:
import os
os.path.dirname(os.path.abspath(__file__))
Si vous voulez dire le répertoire de travail actuel:
import os
os.path.abspath(os.getcwd())
Notez qu'avant et après filesont deux traits de soulignement, pas un seul.
Notez également que si vous exécutez de manière interactive ou si vous avez chargé du code à partir d'un élément autre qu'un fichier (par exemple: une base de données ou une ressource en ligne), il se __file__peut qu'il ne soit pas défini car il n'y a pas de notion de "fichier actuel". La réponse ci-dessus suppose le scénario le plus courant d'exécution d'un script python qui se trouve dans un fichier.
abspath () est obligatoire si vous ne voulez pas découvrir de comportements étranges sur Windows, où dirname ( fichier ) peut retourner une chaîne vide!
Sorin
4
devrait être os.path.dirname (os.path.abspath (os .__ file__))?
DrBailey
5
@DrBailey: non, ActivePython n'a rien de spécial. __file__(notez qu'il s'agit de deux traits de soulignement de chaque côté du mot) est une partie standard de python. Il n'est pas disponible dans les modules basés sur C, par exemple, mais il devrait toujours être disponible dans un script python.
Bryan Oakley
10
Je recommanderais d'utiliser realpath au lieu d'abspath pour résoudre un lien symbolique possible.
TTimo
12
@ cph2117: cela ne fonctionnera que si vous l'exécutez dans un script. Il n'y en a pas __file__si vous utilisez une invite interactive. \
Bryan Oakley
99
L'utilisation Pathest la méthode recommandée depuis Python 3:
from pathlib importPathprint("File Path:",Path(__file__).absolute())print("Directory Path:",Path().absolute())
Je devais faire Path(__file__).parentpour obtenir le dossier qui contient le fichier
YellowPillow
C'est correct @YellowPillow, Path(__file__)vous obtient le fichier. .parentvous obtient un niveau au-dessus du répertoire contenant. Vous pouvez ajouter plus .parentà cela pour monter autant de répertoires que vous le souhaitez.
Ron Kalian
1
Désolé, j'aurais dû clarifier les choses, mais s'il Path().absolute()existe dans un module situé dans path/to/moduleet que vous appelez le module à partir d'un script situé dans path/to/scriptalors reviendrait path/to/scriptau lieu depath/to/module
YellowPillow
1
@YellowPillow Path(__file__).cwd()est plus explicite
Charles
1
Path(__file__)ne fonctionne pas toujours, par exemple, il ne fonctionne pas dans Jupyter Notebook. Path().absolute()résout ce problème.
Ron Kalian
43
En Python 3.x, je fais:
from pathlib importPath
path =Path(__file__).parent.absolute()
Explication:
Path(__file__) est le chemin d'accès au fichier actuel.
.parentvous donne le répertoire lequel se trouve le fichier.
.absolute()vous donne le chemin absolu complet vers elle.
L'utilisation pathlibest la manière moderne de travailler avec des chemins. Si vous en avez besoin plus tard comme chaîne pour une raison quelconque, faites-le str(path).
Cela devrait être la réponse acceptée à partir de 2019. Une chose pourrait également être mentionnée dans la réponse: on peut immédiatement appeler .open()un tel Pathobjet commewith Path(__file__).parent.joinpath('some_file.txt').open() as f:
Désolé mais cette réponse est incorrecte, la bonne est celle faite par Bryan `dirname (abspath ( fichier )). Voir les commentaires pour plus de détails.
Sorin
1
Il donnera / en sortie
Tripathi29
2
@sorin En fait sur Python 3.6, ils sont tous les deux identiques
DollarAkshay
5
Vous pouvez utiliser oset os.pathbibliothèque facilement comme suit
import os
os.chdir(os.path.dirname(os.getcwd()))
os.path.dirnamerenvoie le répertoire supérieur du répertoire actuel. Il nous permet de passer à un niveau supérieur sans passer d'argument de fichier et sans connaître le chemin absolu.
Cela ne donne pas le répertoire du fichier actuel . Il retourne le répertoire du répertoire de travail courant qui pourrait être complètement différent. Ce que vous proposez ne fonctionne que si le fichier se trouve dans le répertoire de travail actuel.
Bryan Oakley
4
Essaye ça:
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
from pathlib importPath#Returns the path of the directory, where your script file is placed
mypath =Path().absolute()print('Absolute path : {}'.format(mypath))#if you want to go to any other file inside the subdirectories of the directory path got from above method
filePath = mypath/'data'/'fuel_econ.csv'print('File path : {}'.format(filePath))#To check if file present in that directory or Not
isfileExist = filePath.exists()print('isfileExist : {}'.format(isfileExist))#To check if the path is a directory or a File
isadirectory = filePath.is_dir()print('isadirectory : {}'.format(isadirectory))#To get the extension of the file
fileExtension = mypath/'data'/'fuel_econ.csv'print('File extension : {}'.format(filePath.suffix))
SORTIE:
LE CHEMIN ABSOLU EST LE CHEMIN O PL VOTRE FICHIER PYTHON EST PLACÉ
Chemin absolu: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2
Chemin du fichier: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2 \ data \ fuel_econ.csv
@Kiro, ma solution répond à la question en utilisant IPython. Par exemple, si quelqu'un répond à une question avec une solution en utilisant une nouvelle bibliothèque, alors à mon humble avis, cela reste une réponse pertinente à la question.
Nafeez Quraishi
@NafeezQuraishi, votre solution introduit une bibliothèque tierce et une classe à partir de laquelle vous devez instancier pour obtenir le résultat souhaité. Moi-même, et je pense que beaucoup d'autres essaient d'éviter d'utiliser des bibliothèques externes pour un certain nombre de raisons, et je n'essaierais votre solution que si rien d'autre ne fonctionnait. Heureusement, il existe une série de fonctions intégrées que vous pouvez utiliser pour obtenir le résultat souhaité, sans avoir besoin d'une bibliothèque externe.
elliotwesoff
@ elli0t, partiellement d'accord. Considérez que quelqu'un utilisant le bloc-notes Jupyter a cette question pour qui peut-être que l'utilisation de la commande magique% pwd serait plus facile et préférable à l'importation os.
Nafeez Quraishi
0
Pour conserver la cohérence de la migration entre les plates-formes (macOS / Windows / Linux), essayez:
## IMPORT MODULESimport os
## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('')## ~ os.getcwd()## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..## ..OR DIFFERENT IN SOME CIRCUMSTANCES
Le répertoire de travail actuel n'est peut-être pas le même que le répertoire du fichier actuel. Votre solution ne fonctionnera que si le répertoire de travail actuel est le même que le répertoire qui contient le fichier. Cela peut être assez courant pendant le développement, mais est généralement assez rare pour un script déployé.
Bryan Oakley
Merci pour l'info. J'ai mis à jour ma réponse pour refléter la possibilité que ceux-ci ne soient pas équivalents renvoyant le même chemin de fichier. C'est la raison pour laquelle j'adhère à la philosophie du codage appelée "programmation incrémentielle", aux tests et à de nombreux appels de fonction print () pour tester la sortie et / ou le retour des valeurs à chaque étape du processus. J'espère que mon code reflète désormais mieux la réalité de os.path.abspath () vs os.getcwd () car je ne prétends pas tout savoir. Cependant, vous pouvez voir que j'ai mis os.getcwd () dans les commentaires non pas comme la solution principale, mais plutôt comme un morceau de code alternatif qui mérite d'être rappelé et vérifié.
Programmeur de Jérusalem
PS Je pense que quelqu'un a édité et effacé la majorité de ma réponse que j'ai postée ici ... :( Cela décourage les gens de participer si leurs réponses vont être censurées et hachées.
Programmeur de Jérusalem
1
Vous êtes la seule personne à avoir modifié cette réponse. De plus, vos modifications ne répondent toujours pas correctement à la question. La question concerne spécifiquement le chemin d'accès au répertoire du fichier, et votre réponse mentionne uniquement l'obtention du répertoire actuel. Ce n'est pas une bonne réponse, car le répertoire courant n'est très souvent pas le même que le répertoire dans lequel se trouve le script. Cela n'a rien à voir avec abspath.
Bryan Oakley
Le code que j'ai partagé donne très certainement un chemin vers le répertoire du fichier s'il est exécuté à partir du répertoire et / ou du fichier d'où vous voulez connaître le chemin absolu du fichier. C'est très certainement une bonne réponse. Veuillez ne pas être un troll.
__file__
n'est pas défini lorsque vous exécutez python en tant que shell interactif. Le premier morceau de code dans votre question semble provenir d'un shell interactif, mais produirait en fait unNameError
, au moins sur python 2.7.3, mais d'autres aussi je suppose.Réponses:
Python 3
Pour le répertoire du script en cours d'exécution:
Pour le répertoire de travail actuel:
Python 2 et 3
Pour le répertoire du script en cours d'exécution:
Si vous voulez dire le répertoire de travail actuel:
Notez qu'avant et après
file
sont deux traits de soulignement, pas un seul.Notez également que si vous exécutez de manière interactive ou si vous avez chargé du code à partir d'un élément autre qu'un fichier (par exemple: une base de données ou une ressource en ligne), il se
__file__
peut qu'il ne soit pas défini car il n'y a pas de notion de "fichier actuel". La réponse ci-dessus suppose le scénario le plus courant d'exécution d'un script python qui se trouve dans un fichier.Références
la source
__file__
(notez qu'il s'agit de deux traits de soulignement de chaque côté du mot) est une partie standard de python. Il n'est pas disponible dans les modules basés sur C, par exemple, mais il devrait toujours être disponible dans un script python.__file__
si vous utilisez une invite interactive. \L'utilisation
Path
est la méthode recommandée depuis Python 3:Documentation: pathlib
Remarque: Si vous utilisez Jupyter Notebook,
__file__
ne renvoie pas la valeur attendue,Path().absolute()
doit donc être utilisé.la source
Path(__file__).parent
pour obtenir le dossier qui contient le fichierPath(__file__)
vous obtient le fichier..parent
vous obtient un niveau au-dessus du répertoire contenant. Vous pouvez ajouter plus.parent
à cela pour monter autant de répertoires que vous le souhaitez.Path().absolute()
existe dans un module situé danspath/to/module
et que vous appelez le module à partir d'un script situé danspath/to/script
alors reviendraitpath/to/script
au lieu depath/to/module
Path(__file__).cwd()
est plus explicitePath(__file__)
ne fonctionne pas toujours, par exemple, il ne fonctionne pas dans Jupyter Notebook.Path().absolute()
résout ce problème.En Python 3.x, je fais:
Explication:
Path(__file__)
est le chemin d'accès au fichier actuel..parent
vous donne le répertoire lequel se trouve le fichier..absolute()
vous donne le chemin absolu complet vers elle.L'utilisation
pathlib
est la manière moderne de travailler avec des chemins. Si vous en avez besoin plus tard comme chaîne pour une raison quelconque, faites-lestr(path)
.la source
.open()
un telPath
objet commewith Path(__file__).parent.joinpath('some_file.txt').open() as f:
la source
/
en sortieVous pouvez utiliser
os
etos.path
bibliothèque facilement comme suitos.path.dirname
renvoie le répertoire supérieur du répertoire actuel. Il nous permet de passer à un niveau supérieur sans passer d'argument de fichier et sans connaître le chemin absolu.la source
Essaye ça:
la source
J'ai trouvé que les commandes suivantes renverraient toutes le chemin complet du répertoire parent d'un script Python 3.6.
Script Python 3.6:
Liens d'explication: .resolve () , .absolute () , Chemin ( fichier ) .parent (). Absolu ()
la source
Système: MacOS
Version: Python 3.6 avec Anaconda
la source
PROPRIÉTÉS UTILES DU CHEMIN EN PYTHON:
SORTIE: LE CHEMIN ABSOLU EST LE CHEMIN O PL VOTRE FICHIER PYTHON EST PLACÉ
Chemin absolu: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2
Chemin du fichier: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2 \ data \ fuel_econ.csv
isfileExist: True
isadirectory: False
Extension de fichier: .csv
la source
Si vous voulez juste voir le répertoire de travail actuel
Si vous souhaitez modifier le répertoire de travail actuel
chemin est une chaîne contenant le chemin requis à déplacer. par exemple
la source
IPython
a une commande magique%pwd
pour obtenir le répertoire de travail actuel. Il peut être utilisé de la manière suivante:Sur IPython, Jupyter Notebook
%pwd
peut être utilisé directement comme suit:la source
Pour conserver la cohérence de la migration entre les plates-formes (macOS / Windows / Linux), essayez:
la source
J'ai créé une fonction à utiliser lors de l'exécution de python sous IIS dans CGI afin d'obtenir le dossier actuel:
la source
Supposons que vous ayez la structure de répertoires suivante: -
principal / pli1 pli2 pli3 ...
la source
la source
abspath
.