65 votes

Une façon élégante de créer tous les répertoires dans un chemin.

Voici quatre pistes :

p1=r'\foo\bar\foobar.txt'
p2=r'\foo\bar\foo\foo\foobar.txt'
p3=r'\foo\bar\foo\foo2\foobar.txt'
p4=r'\foo2\bar\foo\foo\foobar.txt'

Les répertoires peuvent exister ou non sur un lecteur. Quelle serait la manière la plus élégante de créer les répertoires dans chaque chemin ?

Je pensais utiliser os.path.split() dans une boucle, et la vérification d'un dir avec os.path.exists mais je ne sais pas s'il y a une meilleure approche.

0 votes

88voto

David Heffernan Points 292687

Vous êtes à la recherche de os.makedirs() qui fait exactement ce dont vous avez besoin.

La documentation indique :

Fonction de création récursive de répertoire. Comme mkdir(), mais rend tous les répertoires de niveau intermédiaire nécessaires pour contenir le répertoire feuille. Elle lève une exception d'erreur si le répertoire existe déjà ou ne peut pas être créé. être créé.

Parce qu'il échoue si le répertoire leaf existe déjà, vous voudrez tester son existence avant d'appeler os.makedirs() .

48voto

axwell Points 527

Sur Python 3.6+, vous pouvez le faire :

import pathlib

path = pathlib.Path(p4)
path.parent.mkdir(parents=True, exist_ok=True)

14 votes

Le module pathlib a besoin d'une campagne de publicité. Il est génial.

1 votes

@RickTeachey tout à fait d'accord.

2 votes

Je l'aime aussi. Ici avec une seule ligne : pathlib.Path("/path/with/dirs").mkdir(parents=True, exist_ok=True)

2voto

RexBarker Points 666

Une façon simple de construire les chemins dans les systèmes POSIX. Supposons que votre chemin soit quelque chose comme : dirPath = '../foo/bar' où ni l'un ni l'autre foo o bar existent :

path = ''
for d in dirPath.split('/'):
   # handle instances of // in string
   if not d: continue 

   path += d + '/'
   if not os.path.isdir(path):
      os.mkdir(path)

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