¿Cómo puedo crear directorios recursivamente? [duplicate]

8 minutos de lectura

avatar de usuario
Día

¿Existe un método de Python para crear directorios recursivamente? tengo este camino:

/home/dail/

me gustaria crear

/home/dail/first/second/third

¿Puedo hacerlo recursivamente o tengo que crear un directorio tras otro?

Lo mismo para:

chmod y Chon ¿Puedo hacerlo recursivamente sin asignar permisos para cada archivo/directorio?

  • superconjunto: compruebe también si existe: stackoverflow.com/questions/600268/…

    – Ciro Santilli Путлер Капут 六四事

    19 de enero de 2017 a las 11:12

  • Posible duplicado de ¿Cómo puedo crear un directorio anidado de forma segura?

    – jww

    24 de agosto de 2019 a las 7:27


  • @CiroSantilli冠状病毒审查六四事件法轮功 Gracias, muy útil. Por cierto, ¡me gusta tu nombre y retrato, hermano!

    – Chen

    28 de mayo de 2020 a las 5:15


  • @Chen gracias! Es divertido, ¿verdad? 🙂

    – Ciro Santilli Путлер Капут 六四事

    28 de mayo de 2020 a las 7:18

avatar de usuario
hiro protagonista

a partir de python 3.2 puedes hacer esto:

import os
path="/home/dail/first/second/third"
os.makedirs(path, exist_ok=True)

Gracias a exist_ok bandera esto ni siquiera se quejará si el directorio existe (dependiendo de sus necesidades…).


a partir de python 3.4 (que incluye el módulo pathlib) Puedes hacerlo:

from pathlib import Path
path = Path('/home/dail/first/second/third')
path.mkdir(parents=True)

a partir de python 3.5 mkdir también tiene un exist_ok bandera – poniéndolo en True no generará ninguna excepción si el directorio existe:

path.mkdir(parents=True, exist_ok=True)

  • Gracias por la ayuda. Siempre estaba usando os.mkdir que no creaba nietos y más hijos anidados. os.makedirs acaba de resolver mi problema

    – Hamed_gibago

    14 de abril de 2020 a las 7:09

  • @Hamed_gibago ni siquiera necesitas usar el pathlib módulo. os.makedirs es recursivo en sí mismo…

    -hiro protagonista

    14 de abril de 2020 a las 7:25

  • Buena esa. pathlib funciona para mi.

    –Manthan Patel

    26 de junio de 2021 a las 8:25

avatar de usuario
gato más más

os.makedirs es lo que necesitas Para chmod o chown tendrás que usar os.walk y utilícelo en cada archivo/directorio usted mismo.

  • Específicamente: os.makedirs(os.path.join(“/home/dail”, “primero”, “segundo”, “tercero”))

    – triste

    14 mayo 2011 a las 22:41


  • Nota, exist_ok=True es conveniente ahorrarse tener que comprobar si existe primero cada vez.

    – ideasman42

    10 de enero de 2015 a las 3:57

  • Tenga en cuenta que el exist_ok el parámetro solo se agregó en Python 3.2

    – J Killian

    23/03/2015 a las 20:35

avatar de usuario
YOUYANG

Intenta usar os.makedirs:

import os
import errno

try:
    os.makedirs(<path>)
except OSError as e:
    if errno.EEXIST != e.errno:
        raise

  • ¡Bienvenido a Stack Overflow! Gracias por este fragmento de código, que puede proporcionar ayuda inmediata. Una explicación adecuada mejoraría mucho su valor educativo al mostrar por qué esta es una buena solución al problema y lo haría más útil para futuros lectores con preguntas similares, pero no idénticas. Edite su respuesta para agregar una explicación y dar una indicación de las limitaciones y suposiciones que se aplican.

    –Toby Speight

    1 de junio de 2017 a las 12:13

  • Diría que esta respuesta es la correcta para Python 2.x, ya que maneja los errores correctamente y no solicita la ruta del sistema de archivos dos veces (como con os.path.exists Acercarse).

    – maravilla.ratones

    19 de marzo de 2018 a las 22:22

Aquí está mi implementación para su referencia:

def _mkdir_recursive(self, path):
    sub_path = os.path.dirname(path)
    if not os.path.exists(sub_path):
        self._mkdir_recursive(sub_path)
    if not os.path.exists(path):
        os.mkdir(path)

¡Espero que esto ayude!

avatar de usuario
dr.jimbob

Estoy de acuerdo con la respuesta de Cat Plus Plus. Sin embargo, si sabe que esto solo se usará en sistemas operativos similares a Unix, puede usar llamadas externas a los comandos de shell mkdir, chmody chown. Asegúrese de pasar banderas adicionales para afectar recursivamente a los directorios:

>>> import subprocess
>>> subprocess.check_output(['mkdir', '-p', 'first/second/third']) 
# Equivalent to running 'mkdir -p first/second/third' in a shell (which creates
# parent directories if they do not yet exist).

>>> subprocess.check_output(['chown', '-R', 'dail:users', 'first'])
# Recursively change owner to 'dail' and group to 'users' for 'first' and all of
# its subdirectories.

>>> subprocess.check_output(['chmod', '-R', 'g+w', 'first'])
# Add group write permissions to 'first' and all of its subdirectories.

EDITAR originalmente usé commands, que fue una mala elección ya que está en desuso y es vulnerable a los ataques de inyección. (Por ejemplo, si un usuario ingresó para crear un directorio llamado first/;rm -rf --no-preserve-root /;uno podría eliminar potencialmente todos los directorios).

EDITAR 2 Si está usando Python menos de 2.7, use check_call en vez de check_output. Ver el subprocess documentación para detalles.

  • ¡Pero eso no es Python, es un script de shell! Si puede escribir una solución en Python que sea bastante simple e incluso portátil, hágalo de esa manera. 😉

    – Rosh Oxímoron

    14 mayo 2011 a las 19:16

  • @Rosh: Estoy 100% de acuerdo en que Python llama a los comandos de shell * nix y no es portátil (y lo dijo). Pero a menudo me encuentro escribiendo scripts rápidos de python que solo usaré en mis propias cajas de Linux. Llamar a los comandos de shell puede ser más simple para esos propósitos, cuando puede lograr lo que quiere con una bandera (por ejemplo, -R en lugar de un walk double-for loop–(segundo ciclo para archivos en cada walkeditor dir)). Claro que podría haberlos escrito en bash, pero siento que la sintaxis de python es conveniente (define fácilmente funciones/clases) y tener acceso a todas las banderas de la línea de comando es conveniente para mí.

    – Dr. Jimbob

    14 mayo 2011 a las 19:35

  • @dothebart Estoy de acuerdo en que bifurcar es a menudo una mala idea y tendrá más gastos generales. Pero la diferencia es un par de milisegundos (por lo tanto, a menos que esté creando miles de directorios o en un sistema con muchos recursos limitados, entonces es posible que desee reconsiderar Python). A veces, un comando de shell familiar que hace exactamente lo que desea en una línea es más conveniente que replicar la funcionalidad en python usando los comandos de python que vienen con menos funciones integradas (por ejemplo, python’s os.chmod y os.chown no tener opciones recursivas). Decir que la bifurcación siempre es mala parece una optimización prematura.

    – Dr. Jimbob

    06/08/2015 a las 20:54


  • eche un vistazo al módulo pyrrd y reconsidere. La solución que ahora se menciona merece más atención, por eso la voté a favor y esta en contra.

    – dothebart

    07/08/2015 a las 17:31

  • No veo el significado de pyrrd (un contenedor de conveniencia alrededor de una herramienta de db de turno rotativo y enlaces de python existentes) a esta discusión. de acuerdo a su pypi página, la mitad de ese módulo es solo una interfaz orientada a objetos para llamar a un binario con Popen (eso es “bifurcar”, que dijiste “siempre es una mala idea”). (Now, with PyRRD, there are two additional ways to use RRDTool from Python: an object-oriented interface that wraps system calls (Popen) to the rrdtool binary).

    – Dr. Jimbob

    07/08/2015 a las 18:08

  • ¡Pero eso no es Python, es un script de shell! Si puede escribir una solución en Python que sea bastante simple e incluso portátil, hágalo de esa manera. 😉

    – Rosh Oxímoron

    14 mayo 2011 a las 19:16

  • @Rosh: Estoy 100% de acuerdo en que Python llama a los comandos de shell * nix y no es portátil (y lo dijo). Pero a menudo me encuentro escribiendo scripts rápidos de python que solo usaré en mis propias cajas de Linux. Llamar a los comandos de shell puede ser más simple para esos propósitos, cuando puede lograr lo que quiere con una bandera (por ejemplo, -R en lugar de un walk double-for loop–(segundo ciclo para archivos en cada walkeditor dir)). Claro que podría haberlos escrito en bash, pero siento que la sintaxis de python es conveniente (define fácilmente funciones/clases) y tener acceso a todas las banderas de la línea de comando es conveniente para mí.

    – Dr. Jimbob

    14 mayo 2011 a las 19:35

  • @dothebart Estoy de acuerdo en que bifurcar es a menudo una mala idea y tendrá más gastos generales. Pero la diferencia es un par de milisegundos (por lo tanto, a menos que esté creando miles de directorios o en un sistema con muchos recursos limitados, entonces es posible que desee reconsiderar Python). A veces, un comando de shell familiar que hace exactamente lo que desea en una línea es más conveniente que replicar la funcionalidad en python usando los comandos de python que vienen con menos funciones integradas (por ejemplo, python’s os.chmod y os.chown no tener opciones recursivas). Decir que la bifurcación siempre es mala parece una optimización prematura.

    – Dr. Jimbob

    06/08/2015 a las 20:54


  • eche un vistazo al módulo pyrrd y reconsidere. La solución que ahora se menciona merece más atención, por eso la voté a favor y esta en contra.

    – dothebart

    07/08/2015 a las 17:31

  • No veo el significado de pyrrd (un contenedor de conveniencia alrededor de una herramienta de db de turno rotativo y enlaces de python existentes) a esta discusión. de acuerdo a su pypi página, la mitad de ese módulo es solo una interfaz orientada a objetos para llamar a un binario con Popen (eso es “bifurcar”, que dijiste “siempre es una mala idea”). (Now, with PyRRD, there are two additional ways to use RRDTool from Python: an object-oriented interface that wraps system calls (Popen) to the rrdtool binary).

    – Dr. Jimbob

    07/08/2015 a las 18:08

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad