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)?
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")
_