Python 3.5+ :
import pathlib
pathlib.Path('/my/directory').mkdir(parents=True, exist_ok=True)
pathlib.Path.mkdir
tel qu'utilisé ci-dessus crée récursivement le répertoire et ne lève pas d'exception si le répertoire existe déjà. Si vous n'avez pas besoin ou ne voulez pas que les parents soient créés, sautez la commande parents
argument.
Python 3.2+ :
Utilisation de pathlib
:
Si vous le pouvez, installez la version actuelle de pathlib
backport nommé pathlib2
. N'installez pas l'ancien backport non maintenu nommé pathlib
. Ensuite, reportez-vous à la section Python 3.5+ ci-dessus et utilisez-la de la même manière.
Si vous utilisez Python 3.4, même s'il est fourni avec le logiciel pathlib
il manque l'utile exist_ok
option. Le backport a pour but d'offrir une implémentation plus récente et supérieure de l'option mkdir
qui comprend cette option manquante.
Utilisation de os
:
import os
os.makedirs(path, exist_ok=True)
os.makedirs
tel qu'utilisé ci-dessus crée récursivement le répertoire et ne lève pas d'exception si le répertoire existe déjà. Il possède l'option exist_ok
uniquement si vous utilisez Python 3.2+, avec une valeur par défaut de False
. Cet argument n'existe pas dans Python 2.x jusqu'à 2.7. Il n'est donc pas nécessaire de gérer manuellement les exceptions comme dans Python 2.7.
Python 2.7+ :
Utilisation de pathlib
:
Si vous le pouvez, installez la version actuelle de pathlib
backport nommé pathlib2
. N'installez pas l'ancien backport non maintenu nommé pathlib
. Ensuite, reportez-vous à la section Python 3.5+ ci-dessus et utilisez-la de la même manière.
Utilisation de os
:
import os
try:
os.makedirs(path)
except OSError:
if not os.path.isdir(path):
raise
Alors qu'une solution naïve pourrait d'abord utiliser os.path.isdir
suivi par os.makedirs
la solution ci-dessus inverse l'ordre des deux opérations. Ce faisant, elle évite une situation de concurrence courante liée à une double tentative de création du répertoire, et permet également de distinguer les fichiers des répertoires.
Notez que la capture de l'exception et l'utilisation de errno
est d'une utilité limitée car OSError: [Errno 17] File exists
c'est-à-dire errno.EEXIST
est affiché pour les fichiers et les répertoires. Il est plus fiable de vérifier simplement si le répertoire existe.
Alternatif :
mkpath
crée le répertoire imbriqué, et ne fait rien si le répertoire existe déjà. Cela fonctionne à la fois dans Python 2 et 3.
import distutils.dir_util
distutils.dir_util.mkpath(path)
Par Bogue 10948 Cette solution présente une limite importante : elle ne fonctionne qu'une fois par processus python pour un chemin donné. En d'autres termes, si vous l'utilisez pour créer un répertoire, puis supprimez ce répertoire à l'intérieur ou à l'extérieur de Python, puis utilisez la commande mkpath
pour recréer le même répertoire, mkpath
se contentera d'utiliser silencieusement l'information invalide qu'il a mise en cache concernant la création antérieure du répertoire, et ne créera pas réellement le répertoire à nouveau. En revanche, os.makedirs
ne dépend pas d'un tel cache. Cette limitation peut être acceptable pour certaines applications.
En ce qui concerne l'annuaire mode veuillez vous référer à la documentation si vous y tenez.
40 votes
En général, vous devrez tenir compte du cas où le nom du fichier ne contient pas de répertoire. Sur ma machine, dirname('foo.txt') donne '', qui n'existe pas et fait échouer makedirs().
14 votes
Dans python 2.7
os.path.mkdir
n'existe pas. C'estos.mkdir
.9 votes
Si le chemin existe il faut non seulement vérifier si c'est un répertoire et non un fichier normal ou un autre objet (beaucoup de réponses vérifient cela) mais il faut aussi vérifier s'il est accessible en écriture (je n'ai pas trouvé de réponse qui vérifie cela).
13 votes
Dans le cas où vous êtes venu ici pour créer des répertoires parents de la chaîne de chemin de fichier
p
Voici mon extrait de code :os.makedirs(p[:p.rindex(os.path.sep)], exist_ok=True)
2 votes
méta-discussion des réponses à cette question
1 votes
En ce qui concerne les conditions de course pour le cas où le disque est presque plein, vous pouvez éventuellement vérifier qu'un seuil minimum (défini par l'utilisateur) d'espace libre existe avant d'essayer de le faire : Espace restant sur le volume sur plusieurs plates-formes à l'aide de python