895 votes

Fonctionnalité mkdir -p en python

Est-il possible d'obtenir une fonctionnalité similaire à mkdir -p sur le shell ... depuis python. Je suis à la recherche d'une solution autre qu'un appel système. Je suis sûr que le code est inférieur à 20 lignes ... vraiment je me demande si quelqu'un l'a déjà écrit?

1238voto

tzot Points 32224

mkdir -p fonctionnalités comme suit:

import os, errno

def mkdir_p(path):
    try:
        os.makedirs(path)
    except OSError as exc: # Python >2.5
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        else: raise

Mise à jour

Pour Python ≥ 3.2, os.makedirs a un troisième argument optionnel exist_ok , lorsque la valeur est true, permet à l' mkdir -p fonctionnalités -à moins d' mode , et le répertoire existant différentes autorisations à l'; dans ce cas, OSError est relevée comme précédemment.

312voto

larsmans Points 167484

En Python > = 3.2, c’est

Dans les versions antérieures, utilisez la réponse de @tzot.

158voto

Joe Holloway Points 11122

C'est plus facile que de piéger l'exception:

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

MISE À JOUR 2012-07-27

Je suis tenté de supprimer cette réponse, mais je pense qu'il y a de la valeur dans le fil de commentaires ci-dessous. En tant que tel, je le convertis en wiki.

48voto

auraham Points 425

Récemment, j’ai trouvé ce distutils.dir_util.mkpath:

17voto

Jacob Gabrielson Points 8800

mkdir -p vous donne une erreur si le fichier existe déjà:

$ touch /tmp/foo
$ mkdir -p /tmp/foo
mkdir: cannot create directory `/tmp/foo': File exists

Donc, un affinement de la précédente suggestion serait de re-raise l'exception, si os.path.isdir retours False (lors de la vérification pour l' errno.EEXIST).

(Mise à jour) Voir aussi ce très semblable question; je suis d'accord avec la accepté de répondre (et mises en garde) sauf que je recommanderais os.path.isdir au lieu de os.path.exists.

(Mise à jour) Par une suggestion dans les commentaires, la fonction complète ressemblerait à:

import os
def mkdirp(directory):
    if not os.path.isdir(directory):
        os.makedirs(directory)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X