Funcionalidad mkdir -p en Python [duplicado]

Resuelto Setjmp asked hace 15 años • 12 respuestas

¿Hay alguna manera de obtener una funcionalidad similar a mkdir -pla del shell desde Python? Estoy buscando una solución distinta a una llamada al sistema. Estoy seguro de que el código tiene menos de 20 líneas y me pregunto si alguien ya lo ha escrito.

Setjmp avatar Mar 02 '09 01:03 Setjmp
Aceptado

Para Python ≥ 3,5, utilice pathlib.Path.mkdir:

import pathlib
pathlib.Path("/tmp/path/to/desired/directory").mkdir(parents=True, exist_ok=True)

El exist_okparámetro se agregó en Python 3.5.


Para Python ≥ 3.2, os.makedirstiene un tercer argumento opcionalexist_ok que, cuando True, habilita la mkdir -pfuncionalidad, a menos que mode se proporcione y el directorio existente tenga permisos diferentes a los previstos; en ese caso, OSErrorse plantea como anteriormente:

import os
os.makedirs("/tmp/path/to/desired/directory", exist_ok=True)

Para versiones aún más antiguas de Python, puedes usar os.makedirse ignorar el error:

import errno    
import os

def mkdir_p(path):
    try:
        os.makedirs(path)
    except OSError as exc:  # Python ≥ 2.5
        if exc.errno == errno.EEXIST and os.path.isdir(path):
            pass
        # possibly handle other errno cases here, otherwise finally:
        else:
            raise
tzot avatar Mar 01 '2009 21:03 tzot

En Python >=3.2, eso es

os.makedirs(path, exist_ok=True)

En versiones anteriores, utilice la respuesta de @tzot .

Fred Foo avatar Jun 19 '2012 13:06 Fred Foo

Esto es más fácil que atrapar la excepción:

import os
if not os.path.exists(...):
    os.makedirs(...)

Descargo de responsabilidad Este enfoque requiere dos llamadas al sistema, lo que es más susceptible a condiciones de carrera en ciertos entornos/condiciones. Si está escribiendo algo más sofisticado que un simple script desechable que se ejecuta en un entorno controlado, es mejor que opte por la respuesta aceptada que requiere solo una llamada al sistema.

ACTUALIZACIÓN 2012-07-27

Estoy tentado a eliminar esta respuesta, pero creo que el hilo de comentarios a continuación es valioso. Como tal, lo estoy convirtiendo en un wiki.

Joe Holloway avatar Mar 02 '2009 00:03 Joe Holloway

Recientemente, encontré este distutils.dir_util.mkpath :

In [17]: from distutils.dir_util import mkpath

In [18]: mkpath('./foo/bar')
Out[18]: ['foo', 'foo/bar']
auraham avatar Jan 15 '2013 21:01 auraham

Con Pathlib de la biblioteca estándar python3:

Path(mypath).mkdir(parents=True, exist_ok=True)

Si los padres son verdaderos, los padres que faltan en esta ruta se crean según sea necesario; se crean con los permisos predeterminados sin tener en cuenta el modo (imitando el comando POSIX mkdir -p). Si exist_ok es falso (el valor predeterminado), se genera un FileExistsError si el directorio de destino ya existe.

Si exist_ok es verdadero, las excepciones FileExistsError se ignorarán (el mismo comportamiento que el comando POSIX mkdir -p), pero solo si el último componente de la ruta no es un archivo existente que no sea de directorio.

Modificado en la versión 3.5: se agregó el parámetro exist_ok.

Ali SAID OMAR avatar Feb 08 '2016 17:02 Ali SAID OMAR