Comment obtenir le chemin complet du répertoire du fichier actuel?


806

Je veux obtenir le chemin du répertoire du fichier actuel. J'ai essayé:

>>> os.path.abspath(__file__)
'C:\\python27\\test.py'

Mais comment puis-je récupérer le chemin du répertoire?

Par exemple:

'C:\\python27\\'


5
__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:

import pathlib
pathlib.Path(__file__).parent.absolute()

Pour le répertoire de travail actuel:

import pathlib
pathlib.Path().absolute()

Python 2 et 3

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.

Références

  1. pathlib dans la documentation python.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. que signifie / fait la variable __file__?

43
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 import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

Documentation: pathlib

Remarque: Si vous utilisez Jupyter Notebook, __file__ne renvoie pas la valeur attendue, Path().absolute()doit donc être utilisé.


17
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 import Path

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


3
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:
stefanct

9
import os
print os.path.dirname(__file__)

21
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.


7
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


2

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:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from pathlib import Path

#Get the absolute path of a Python3.6 script
dir1 = Path().resolve()  #Make the path absolute, resolving any symlinks.
dir2 = Path().absolute() #See @RonKalian answer 
dir3 = Path(__file__).parent.absolute() #See @Arminius answer 

print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}')

Liens d'explication: .resolve () , .absolute () , Chemin ( fichier ) .parent (). Absolu ()


2

Système: MacOS

Version: Python 3.6 avec Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

PROPRIÉTÉS UTILES DU CHEMIN EN PYTHON:

 from pathlib import Path

    #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

isfileExist: True

isadirectory: False

Extension de fichier: .csv


1

Si vous voulez juste voir le répertoire de travail actuel

import os
print(os.getcwd)

Si vous souhaitez modifier le répertoire de travail actuel

os.chdir(path)

chemin est une chaîne contenant le chemin requis à déplacer. par exemple

path = "C:\\Users\\xyz\\Desktop\\move here"

0

IPythona une commande magique %pwdpour obtenir le répertoire de travail actuel. Il peut être utilisé de la manière suivante:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

Sur IPython, Jupyter Notebook %pwdpeut être utilisé directement comme suit:

present_working_directory = %pwd

5
La question ne concerne pas IPython
Kiro

1
@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:

path = r'%s' % os.getcwd().replace('\\','/')

0

J'ai créé une fonction à utiliser lors de l'exécution de python sous IIS dans CGI afin d'obtenir le dossier actuel:

import os 
   def getLocalFolder():
        path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
        return path[len(path)-1]

0

Supposons que vous ayez la structure de répertoires suivante: -

principal / pli1 pli2 pli3 ...

folders = glob.glob("main/fold*")

for fold in folders:
    abspath = os.path.dirname(os.path.abspath(fold))
    fullpath = os.path.join(abspath, sch)
    print(fullpath)

-1
## IMPORT MODULES
import os

## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('') ## ~ os.getcwd()
## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..
## ..OR DIFFERENT IN SOME CIRCUMSTANCES

2
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.
Jerusalem Programmer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.