2011-03-06 16 views
18

Aquí hay cuatro caminos:manera elegante de hacer todos los directorios en un camino

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' 

Los directorios pueden o no pueden existir en una unidad. ¿Cuál sería la forma más elegante de crear los directorios en cada ruta?

Estaba pensando en utilizar os.path.split() en un bucle, y buscando un directorio con os.path.exists, pero no sé si hay un mejor enfoque.

+0

Casi: https://stackoverflow.com/q/6004073/1959808 –

Respuesta

33

Está buscando os.makedirs() que hace exactamente lo que necesita.

La documentación:

función de creación de directorios recursivo. Me gusta mkdir(), pero hace que todos los directorios de nivel intermedio necesiten para contener el directorio de la hoja. Aumenta una excepción de error si el directorio de la hoja ya existe o no puede ser creado.

Como falla si el directorio de hojas ya existe, querrá probar la existencia antes de llamar al os.makedirs().

+0

Lol. 1: 0 para Python. No puedo creer que me haya perdido eso y que he estado usando 'os.mkdir()' exclusivamente. Gracias, David :) – marw

+0

@marw Nunca había oído hablar de eso, simplemente hice una búsqueda web con la palabra clave mágica "recursiva". –

+2

las pruebas de existencia introducen una posible condición de carrera (el directorio puede ser creado * después de * usted probó su existencia antes * de * su llamada a 'makedirs()'). Entonces simplemente use 'try: .. excepto OSError' sin la prueba. – jfs

1

En Python 3.6 o superior que puede hacer:

import pathlib 

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

El módulo pathlib necesita una campaña publicitaria. Es asombroso. –

+0

@RickTeachey no podría estar más de acuerdo – axwell

Cuestiones relacionadas