human
Dites que je veux créer un fichier :
```filename = &quot;/foo/bar/baz.txt&quot;
with open(filename, &quot;w&quot;) as f:
    f.write(&quot;FOOBAR&quot;)
```
Cela donne une ```IOError```, car ```/foo/bar``` n'existe pas.
Quelle est la manière la plus pythonique de générer automatiquement ces répertoires ? Est-il nécessaire d'appeler explicitement ```os.path.exists``` et ```os.mkdir``` sur chacun d'eux (c'est-à-dire /foo, puis /foo/bar)
gpt
En Python 3.2+, en utilisant les API demandées par l'OP, vous pouvez élégamment faire ce qui suit :
```
import os
filename = &quot;/foo/bar/baz.txt&quot;
os.makedirs(os.path.dirname(filename), exist_ok=True)
with open(filename, &quot;w&quot;) as f:
    f.write(&quot;FOOBAR&quot;)
```

Avec le module Pathlib (introduit dans Python 3.4), il existe une syntaxe alternative (merci David258) :
```from pathlib import Path
output_file = Path(&quot;/foo/bar/baz.txt&quot;)
output_file.parent.mkdir(exist_ok=True, parents=True)
output_file.write_text(&quot;FOOBAR&quot;)
```

Dans les anciennes versions de Python, il existe une manière moins élégante :
La fonction ```os.makedirs``` fait cela. Essayez ce qui suit :
```import os
import errno
filename = &quot;/foo/bar/baz.txt&quot;
if not os.path.exists(os.path.dirname(filename)):
    try:
        os.makedirs(os.path.dirname(filename))
    except OSError as exc: # Protéger contre les conditions de concurrence
        if exc.errno != errno.EEXIST:
            raise
with open(filename, &quot;w&quot;) as f:
    f.write(&quot;FOOBAR&quot;)
```
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 contre les conditions de concurrence.