web-dev-qa-db-fra.com

Création automatique de répertoires avec sortie de fichier

Duplicate possible:
fonctionnalité mkdir -p en python

Dites que je veux faire un fichier:

filename = "/foo/bar/baz.txt"

with open(filename, "w") as f:
    f.write("FOOBAR")

Cela donne un IOError, puisque /foo/bar n'existe pas.

Quel est le moyen le plus pythonique de générer ces répertoires automatiquement? Est-il nécessaire pour moi d'appeler explicitement os.path.exists et os.mkdir sur chacun d'entre eux (c'est-à-dire,/foo, puis/foo/bar)?

289
Phil

La fonction os.makedirs effectue cette opération. Essayez ce qui suit:

_import os
import errno

filename = "/foo/bar/baz.txt"
if not os.path.exists(os.path.dirname(filename)):
    try:
        os.makedirs(os.path.dirname(filename))
    except OSError as exc: # Guard against race condition
        if exc.errno != errno.EEXIST:
            raise

with open(filename, "w") as f:
    f.write("FOOBAR")
_

La raison d'ajouter le bloc _try-except_ est de gérer le cas où le répertoire a été créé entre les appels _os.path.exists_ et _os.makedirs_, afin de nous protéger des conditions de concurrence critique.


Dans Python 3.2+, il existe un plus élégant qui évite la situation de concurrence critique ci-dessus:

_filename = "/foo/bar/baz.txt"¨
os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, "w") as f:
    f.write("FOOBAR")
_
541
Krumelur