Funcionalidad mkdir -p en Python [duplicado]
¿Hay alguna manera de obtener una funcionalidad similar a mkdir -p
la 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.
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_ok
parámetro se agregó en Python 3.5.
Para Python ≥ 3.2, os.makedirs
tiene un tercer argumento opcionalexist_ok
que, cuando True
, habilita la mkdir -p
funcionalidad, a menos que mode
se proporcione y el directorio existente tenga permisos diferentes a los previstos; en ese caso, OSError
se 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.makedirs
e 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
En Python >=3.2, eso es
os.makedirs(path, exist_ok=True)
En versiones anteriores, utilice la respuesta de @tzot .
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.
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']
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.