web-dev-qa-db-fra.com

Rechercher le répertoire actuel et le répertoire du fichier

En Python, quelles commandes puis-je utiliser pour trouver:

  1. le répertoire en cours (où j'étais dans le terminal lorsque j'ai exécuté le script Python), et
  2. où est le fichier que je suis en train d'exécuter?
1910
John Howard

Pour obtenir le chemin complet du répertoire contenant un fichier Python, écrivez-le dans ce fichier:

_import os 
dir_path = os.path.dirname(os.path.realpath(__file__))
_

(Notez que l'incantation ci-dessus ne fonctionnera pas si vous avez déjà utilisé os.chdir() pour modifier votre répertoire de travail actuel, car la valeur de la constante ___file___ est relative au répertoire de travail actuel et n'est pas modifiée par un appel os.chdir(). .)


Pour obtenir le répertoire de travail actuel, utilisez

_import os
cwd = os.getcwd()
_

Références de la documentation pour les modules, constantes et fonctions utilisées ci-dessus:

2972
Russell Dias

Répertoire de travail actuel: os.getcwd()

Et le attribut __file__ peut vous aider à localiser le fichier que vous exécutez. Ce SO post explique tout: Comment obtenir le chemin du fichier actuellement exécuté en Python?

305
Nix

Vous pouvez trouver cela utile comme référence:

import os

print("Path at terminal when executing this file")
print(os.getcwd() + "\n")

print("This file path, relative to os.getcwd()")
print(__file__ + "\n")

print("This file full path (following symlinks)")
full_path = os.path.realpath(__file__)
print(full_path + "\n")

print("This file directory and name")
path, filename = os.path.split(full_path)
print(path + ' --> ' + filename + "\n")

print("This file directory only")
print(os.path.dirname(full_path))
256
Daniel Reis

pathlib module, introduit dans Python 3.4 ( PEP 428 - Le module pathlib - chemins d'accès au système de fichiers orienté objet ), rend expérience sur le chemin beaucoup beaucoup mieux.

_$ pwd
/home/skovorodkin/stack
$ tree
.
└── scripts
    ├── 1.py
    └── 2.py
_

Pour obtenir le répertoire de travail actuel, utilisez Path.cwd() :

_from pathlib import Path

print(Path.cwd())  # /home/skovorodkin/stack
_

Pour obtenir un chemin absolu vers votre fichier de script, utilisez la méthode Path.resolve() :

_print(Path(__file__).resolve())  # /home/skovorodkin/stack/scripts/1.py
_

Et pour obtenir le chemin d’un répertoire dans lequel se trouve votre script, accédez à .parent (il est recommandé d’appeler .resolve() avant _.parent_):

_print(Path(__file__).resolve().parent)  # /home/skovorodkin/stack/scripts
_

Rappelez-vous que ___file___ n'est pas fiable dans certaines situations: Comment obtenir le chemin du fichier actuellement exécuté en Python? .


Veuillez noter que Path.cwd(), Path.resolve() et les autres méthodes Path renvoient des objets de chemin ( PosixPath dans mon cas), et non des chaînes. Dans Python 3.4 et 3.5, cela posait problème, car open la fonction intégrée ne pouvait fonctionner qu'avec des objets chaîne ou octets, et ne supportait pas les objets Path; vous deviez donc convertir Path objets en chaînes ou utilisez la méthode Path.open() , mais cette dernière option vous obligeait à changer l'ancien code:

_$ cat scripts/2.py
from pathlib import Path

p = Path(__file__).resolve()

with p.open() as f: pass
with open(str(p)) as f: pass
with open(p) as f: pass

print('OK')

$ python3.5 scripts/2.py
Traceback (most recent call last):
  File "scripts/2.py", line 11, in <module>
    with open(p) as f:
TypeError: invalid file: PosixPath('/home/skovorodkin/stack/scripts/2.py')
_

Comme vous pouvez le constater, open(p) ne fonctionne pas avec Python 3.5.

PEP 519 - Ajout d'un protocole de chemin de système de fichiers , implémenté dans Python 3.6, ajoute la prise en charge de PathLike objets à open fonction Alors maintenant, vous pouvez passer les objets Path à la fonction open directement:

_$ python3.6 scripts/2.py
OK
_
58
skovorodkin

1.Pour obtenir le chemin complet du répertoire actuel

    >>import os
    >>print os.getcwd()

o/p: "C:\Utilisateurs\admin\mon dossier"

1.Pour obtenir le nom du dossier du répertoire actuel uniquement

    >>import os
    >>str1=os.getcwd()
    >>str2=str1.split('\\')
    >>n=len(str2)
    >>print str2[n-1]

o/p: "mon dossier"

54
vinithravit

Si vous essayez de trouver le répertoire actuel du fichier dans lequel vous vous trouvez actuellement:

Manière agnostique OS:

dirname, filename = os.path.split(os.path.abspath(__file__))
35
Kurt

Si vous utilisez Python 3.4, le tout nouveau module pathlib de niveau supérieur vous permet d'appeler facilement pathlib.Path.cwd() pour obtenir un objet Path représentant votre répertoire de travail actuel, ainsi que de nombreuses autres nouvelles fonctionnalités.

Plus d'informations sur cette nouvelle API peuvent être trouvées ici .

29
Jazzer

Réponse à # 1:

Si vous voulez le répertoire actuel, procédez comme suit:

import os
os.getcwd()

Si vous voulez juste un nom de dossier et que vous avez le chemin d'accès à ce dossier, procédez comme suit:

def get_folder_name(folder):
    '''
    Returns the folder name, given a full folder path
    '''
    return folder.split(os.sep)[-1]

Réponse à la question 2:

import os
print os.path.abspath(__file__)
27
Blairg23

Un peu tard pour le parti, mais je pense que la façon la plus succincte de trouver le nom de votre contexte d’exécution actuel serait:

current_folder_path, current_folder_name = os.path.split(os.getcwd())
26
StormShadow

Pathlib peut être utilisé de cette façon pour obtenir le répertoire contenant le script actuel:

import pathlib
filepath = pathlib.Path(__file__).resolve().parent
18
Mathieu C.

Pour obtenir le chemin complet du répertoire actuel:

os.path.realpath ('.')

16
Ilia S.

Si vous recherchez l'emplacement du script en cours d'exécution, vous pouvez utiliser sys.argv[0] pour obtenir le chemin complet.

16
Grochni

Afin de voir le type de répertoire de travail actuel, le script suivant:

import os
current_working_directory = os.getcwd()
9
Mohammad Hassan

Pour la question 1, utilisez os.getcwd() # get working dir et os.chdir(r'D:\Steam\steamapps\common') # set working dir


Je recommande d'utiliser sys.argv[0] pour la question 2, car sys.argv est immuable et renvoie donc toujours le fichier actuel (chemin d'objet du module) et n'est pas affecté par os.chdir(). Aussi, vous pouvez faire comme ça:

import os
this_py_file = os.path.realpath(__file__)

# vvv Below comes your code vvv #

mais cet extrait et sys.argv[0] ne fonctionnera pas ou fonctionnera bizarre une fois compilé par PyInstaller car les propriétés magiques ne sont pas définies dans le niveau __main__ et sys.argv[0] est la façon dont votre exe a été appelé. devient affecté par le répertoire de travail).

6

Pour obtenir votre répertoire de travail en python. Vous pouvez utiliser le code suivant:

import os
cwd = os.getcwd() #to get current working directory
print(cwd)
4
Nirali Khoda