Comment savoir si le répertoire existe en Python

1140

Dans le osmodule en Python, existe-t-il un moyen de trouver si un répertoire existe, quelque chose comme:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False
David542
la source
8
Un mot d'avertissement - la réponse la mieux notée peut être sensible aux conditions de concurrence. Vous voudrez peut-être effectuer à la os.statplace, pour voir si le répertoire existe et est un répertoire au même moment.
d33tah
1
@ d33tah Vous avez peut-être un bon point, mais je ne vois pas de moyen d'utiliser os.statpour distinguer le répertoire d'un fichier. Il se déclenche OSErrorlorsque le chemin n'est pas valide, qu'il s'agisse d'un fichier ou d'un répertoire. En outre, tout code après vérification est également sensible aux conditions de course.
Tomáš Zato - Reinstate Monica
4
@ TomášZato: ce qui conduit à la conclusion qu'il est sûr d'effectuer l'opération et de gérer les erreurs.
d33tah
2
@ David542 J'ai ajouté un cas de clarification avec des tests de précision pour "isdir" "existe". Je pense que tu apprendrais quelque chose maintenant. Mais cela pourrait illuminer de nouvelles personnes.
GeoStoneMarten

Réponses:

1729

Vous recherchez os.path.isdir, ou os.path.existssi vous ne vous souciez pas s'il s'agit d'un fichier ou d'un répertoire.

Exemple:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))
phihag
la source
4
@syedrakib Bien que les parenthèses puissent être utilisées pour indiquer qu'un objet est appelable, cela n'est pas utile en Python, car même les classes sont appelables. De plus, les fonctions sont des valeurs de première classe en Python, et vous pouvez les utiliser sans la notation entre parenthèses, comme dansexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag
10
Vous pouvez passer des fonctions à d'autres fonctions, comme map, mais dans le cas général, vous appelez des fonctions avec des arguments et des parenthèses. De plus, il y a une faute de frappe dans votre exemple. sans doute vous voulez dire filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown
4
De plus, il y en a os.path.isfile(path)si vous vous souciez seulement de savoir s'il s'agit d'un fichier.
Nicholas
2
Sachez que sur certaines plates-formes, elles renverront false si le fichier / répertoire existe, mais une erreur d'autorisation de lecture se produit également.
Cowlinator
74

Si proche! os.path.isdirrenvoie Truesi vous transmettez le nom d'un répertoire qui existe actuellement. S'il n'existe pas ou s'il ne s'agit pas d'un répertoire, il revient False.

Kirk Strauser
la source
70

Python 3.4 a introduit le pathlibmodule dans la bibliothèque standard, qui fournit une approche orientée objet pour gérer les chemins du système de fichiers. Les méthodes is_dir()et exists()d'un Pathobjet peuvent être utilisées pour répondre à la question:

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

Les chemins (et chaînes) peuvent être joints avec l' /opérateur:

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

Pathlib est également disponible sur Python 2.7 via le module pathlib2 sur PyPi.

joelostblom
la source
Une explication serait utile. Pourquoi faites-vous " p / 'bin' / 'vim'?
Nathan
1
@frank J'ai développé un peu la deuxième partie de la réponse.
joelostblom
34

Oui, utilisez os.path.exists().

aganders3
la source
23
Cela ne vérifie pas que le chemin est un répertoire.
Kirk Strauser
7
Bon appel. D'autres ont souligné que cela os.path.isdirpermettrait d'atteindre cet objectif.
aganders3
3
Si vous comprenez que cela ne répond pas à la question, pourquoi ne supprimez-vous pas la réponse?
3
@CamilStaps Cette question a été vue 354000 fois (maintenant). Les réponses ici ne sont pas seulement pour OP, elles sont pour quiconque pourrait venir ici pour une raison quelconque. La réponse d'aganders3 est pertinente même si elle ne résout pas directement le problème d'OP.
Gabriel
4
@Gabriel alors il devrait être clair dans la réponse ce que cela fait réellement.
21

Nous pouvons vérifier avec 2 fonctions intégrées

os.path.isdir("directory")

Cela donnera booléen true le répertoire spécifié est disponible.

os.path.exists("directoryorfile")

Cela donnera boolead true si le répertoire ou le fichier spécifié est disponible.

Pour vérifier si le chemin est un répertoire;

os.path.isdir("directorypath")

donnera booléen true si le chemin est un répertoire

Vivek Ananthan
la source
2
Ceci est entièrement redondant avec la réponse la plus ancienne et la meilleure.
Davis Herring
10

Un péché:

In [3]: os.path.exists('/d/temp')
Out[3]: True

Probablement jeter un os.path.isdir(...)pour être sûr.

AlG
la source
10

Juste pour fournir la os.statversion (python 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise
Tyler A.
la source
7

os vous offre beaucoup de ces capacités:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

le listdir lèvera une exception si le chemin d'entrée n'est pas valide.

dputros
la source
5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')
JoboFive
la source
6
python a des fonctions intégrées pour créer des répertoires, donc mieux utiliser os.makedirs('mydir')au lieu deos.system(...)
gizzmole
9
Vous imprimez que «un nouveau répertoire a été créé» mais vous ne le savez pas. Et si vous n'avez pas les autorisations pour créer un répertoire? Vous imprimeriez «un nouveau répertoire a été créé» mais ce ne serait pas vrai. Est-ce que cela serait.
Wojciech Jakubas
4

Il y a un Unipathmodule pratique .

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

Autres éléments connexes dont vous pourriez avoir besoin:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

Vous pouvez l'installer en utilisant pip:

$ pip3 install unipath

C'est similaire au intégré pathlib. La différence est qu'il traite chaque chemin comme une chaîne ( Pathest une sous-classe de str), donc si une fonction attend une chaîne, vous pouvez facilement lui passer un Pathobjet sans avoir besoin de la convertir en chaîne.

Par exemple, cela fonctionne très bien avec Django et settings.py:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'
Max Malysh
la source
4

Vous pouvez également vouloir créer le répertoire s'il n'est pas là.

Source , s'il est toujours là sur SO.

================================================== ===================

Sur Python ≥ 3,5, utilisez pathlib.Path.mkdir:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

Pour les anciennes versions de Python, je vois deux réponses avec de bonnes qualités, chacune avec un petit défaut, je vais donc donner mon avis:

Essayez os.path.existset pensez os.makedirsà la création.

import os
if not os.path.exists(directory):
    os.makedirs(directory)

Comme indiqué dans les commentaires et ailleurs, il existe une condition de concurrence - si le répertoire est créé entre le os.path.existset les os.makedirsappels, le os.makedirséchouera avec un OSError. Malheureusement, la capture de couverture OSErroret la poursuite ne sont pas infaillibles, car elles ignoreront l'échec de la création du répertoire en raison d'autres facteurs, tels que des autorisations insuffisantes, un disque plein, etc.

Une option serait de piéger le OSErroret d'examiner le code d'erreur incorporé (voir Existe - t-il un moyen multiplateforme d'obtenir des informations à partir de OSError de Python ):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

Alternativement, il pourrait y en avoir un second os.path.exists, mais supposons qu'un autre crée le répertoire après la première vérification, puis le supprime avant le second - nous pourrions encore être dupes.

Selon l'application, le danger des opérations simultanées peut être supérieur ou inférieur au danger posé par d'autres facteurs tels que les autorisations de fichiers. Le développeur devrait en savoir plus sur l'application particulière en cours de développement et son environnement attendu avant de choisir une implémentation.

Les versions modernes de Python améliorent un peu ce code, à la fois en exposant FileExistsError(en 3.3 +) ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... et en permettant à un argument mot-clé d'être os.makedirsappeléexist_ok (en 3.2+).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.
Nathan
la source
0

Deux choses

  1. vérifier si le répertoire existe?
  2. sinon, créez un répertoire (facultatif).
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
Uday Kiran
la source