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"))
@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.
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 importPathIn[2]: p =Path('/usr')In[3]: p.exists()Out[3]:TrueIn[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]:TrueIn[8]: q.is_dir()Out[8]:False
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
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.
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:
import os
ifnot 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.
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 +) ...
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")
os.stat
place, pour voir si le répertoire existe et est un répertoire au même moment.os.stat
pour distinguer le répertoire d'un fichier. Il se déclencheOSError
lorsque 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.Réponses:
Vous recherchez
os.path.isdir
, ouos.path.exists
si vous ne vous souciez pas s'il s'agit d'un fichier ou d'un répertoire.Exemple:
la source
existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
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 direfilter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])
.os.path.isfile(path)
si vous vous souciez seulement de savoir s'il s'agit d'un fichier.Si proche!
os.path.isdir
renvoieTrue
si 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 revientFalse
.la source
Python 3.4 a introduit le
pathlib
module dans la bibliothèque standard, qui fournit une approche orientée objet pour gérer les chemins du système de fichiers. Les méthodesis_dir()
etexists()
d'unPath
objet peuvent être utilisées pour répondre à la question:Les chemins (et chaînes) peuvent être joints avec l'
/
opérateur:Pathlib est également disponible sur Python 2.7 via le module pathlib2 sur PyPi.
la source
p / 'bin' / 'vim'
?Oui, utilisez
os.path.exists()
.la source
os.path.isdir
permettrait d'atteindre cet objectif.Nous pouvons vérifier avec 2 fonctions intégrées
Cela donnera booléen true le répertoire spécifié est disponible.
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
la source
Oui, utilisez os.path.isdir (chemin)
la source
Un péché:
Probablement jeter un
os.path.isdir(...)
pour être sûr.la source
Juste pour fournir la
os.stat
version (python 2):la source
os vous offre beaucoup de ces capacités:
le listdir lèvera une exception si le chemin d'entrée n'est pas valide.
la source
la source
os.makedirs('mydir')
au lieu deos.system(...)
Il y a un
Unipath
module pratique .Autres éléments connexes dont vous pourriez avoir besoin:
Vous pouvez l'installer en utilisant pip:
C'est similaire au intégré
pathlib
. La différence est qu'il traite chaque chemin comme une chaîne (Path
est une sous-classe destr
), donc si une fonction attend une chaîne, vous pouvez facilement lui passer unPath
objet sans avoir besoin de la convertir en chaîne.Par exemple, cela fonctionne très bien avec Django et
settings.py
:la source
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
: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.exists
et pensezos.makedirs
à la création.Comme indiqué dans les commentaires et ailleurs, il existe une condition de concurrence - si le répertoire est créé entre le
os.path.exists
et lesos.makedirs
appels, leos.makedirs
échouera avec unOSError
. Malheureusement, la capture de couvertureOSError
et 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
OSError
et d'examiner le code d'erreur incorporé (voir Existe - t-il un moyen multiplateforme d'obtenir des informations à partir de OSError de Python ):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 +) ...... et en permettant à un argument mot-clé d'être
os.makedirs
appeléexist_ok
(en 3.2+).la source
Deux choses
la source