2012-09-20 15 views
147

Duplicar posibles:
mkdir -p functionality in pythonla creación automática de directorios con la salida del archivo

decir que quiero hacer un archivo:

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

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

Esto da una IOError, ya /foo/bar hace no existe.

¿Cuál es la forma más pitónica de generar esos directorios automáticamente? ¿Es necesario que llame explícitamente al os.path.exists y al os.mkdir en cada uno (es decir,/foo, then/foo/bar)?

Respuesta

290

La función os.makedirs hace esto. Pruebe lo siguiente:

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 razón para añadir el bloque try-except es para manejar el caso cuando el directorio se crea entre la os.path.exists y los os.makedirs llamadas, por lo que para protegernos de las condiciones de carrera.


En Python 3.2+, hay una more elegant way que evita la condición de carrera arriba:

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

sólo tenía que mirar más allá de 'os.mkdir' y lea la documentación de una función más :) – mgilson

+1

Aquí hay un enfoque ligeramente diferente: http://stackoverflow.com/a/14364249/1317713 ¿Pensamientos? – Leonid

+1

¿Es necesario el campo inicial 'if not os.path.exists' ya que' os.makedirs' usa [EAFP] (https://docs.python.org/2/glossary.html#term-eafp)? –

Cuestiones relacionadas