Eliminar carpetas en python recursivamente

4 minutos de lectura

avatar de usuario
Sriram

Tengo un problema con la eliminación de directorios vacíos. Aquí está mi código:

for dirpath, dirnames, filenames in os.walk(dir_to_search):
    //other codes

    try:
        os.rmdir(dirpath)
    except OSError as ex:
        print(ex)

El argumento dir_to_search es donde estoy pasando el directorio donde se debe realizar el trabajo. Ese directorio se ve así:

test/20/...
test/22/...
test/25/...
test/26/...

Tenga en cuenta que todas las carpetas anteriores están vacías. Cuando ejecuto este script, las carpetas 20,25 solo se borra! Pero las carpetas 25 y 26 no se eliminan, aunque sean carpetas vacías.

Editar:

La excepción que estoy recibiendo son:

[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/26'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/25'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27/tmp'

¿Dónde estoy cometiendo un error?

  • ¿estás seguro de que no tienen archivos ocultos?

    – Jeff

    29 de octubre de 2012 a las 8:22

  • ¿Se imprime una excepción o un rastreo? Si es así, ayudaría si agregara eso a la pregunta

    –Ngure Nyaga

    29 de octubre de 2012 a las 8:23

  • @Jeff: Sí, estoy seguro. De hecho en mi máquina ubuntu probé rmdir /path/to/25th/folder está borrando todo el directorio. ¡Lo que significa que ese directorio está vacío!

    – Sriram

    29 de octubre de 2012 a las 8:29


  • Posible duplicado de ¿Cómo elimino/elimino una carpeta que no está vacía con Python? tanto de la pregunta como de la respuesta

    – Trevor Boyd Smith

    17/10/2016 a las 21:27


avatar de usuario
Tomek

Probar shutil.rmtree:

import shutil
shutil.rmtree('/path/to/your/dir/')

  • ¿El rmtree borrado todo el directorio? Supongo que es similar a la rm -Rf $DIR

    – Sriram

    29 de octubre de 2012 a las 8:31

  • Tenga cuidado ya que rmtree también elimina los archivos. Como se le preguntó, la pregunta era cómo eliminar directorios VACÍOS. Los documentos para os.walk dan un ejemplo que coincide casi exactamente con esta pregunta: import os for root, dirs, files in os.walk(top, topdown=False): for name in dirs: os.rmdir(os.path.join(root, name))

    – Dave Sawyer

    30 de noviembre de 2018 a las 18:32


avatar de usuario
mitch

Aquí está mi puro pathlib Desvinculador de directorio recursivo:

from pathlib import Path

def rmdir(directory):
    directory = Path(directory)
    for item in directory.iterdir():
        if item.is_dir():
            rmdir(item)
        else:
            item.unlink()
    directory.rmdir()

rmdir(Path("dir/"))

  • Supongamos que es mejor que shutil, por lo tanto, shutil es asincrónico.

    – Olga Pshenichnikova

    29 de abril de 2021 a las 11:29

  • Muy bonito, y un ejemplo tangible de recursividad como bonificación.

    – Nesha25

    30 de marzo a las 16:56

avatar de usuario
lqs

El comportamiento predeterminado de os.walk() es caminar de la raíz a la hoja. Establecer topdown=False en os.walk() caminar de la hoja a la raíz.

avatar de usuario
microo8

Probar rmtree() en shutil de la biblioteca estándar de Python

avatar de usuario
Gajender

mejor usar la ruta absoluta e importar solo la función rmtree
from shutil import rmtree
como se trata de un paquete grande, la línea anterior solo importará la función requerida.

from shutil import rmtree
rmtree('directory-absolute-path')

avatar de usuario
Justo Wingert

Solo para el próximo tipo que busque una solución de micropython, esto funciona puramente en función del sistema operativo (listdir, remove, rmdir). No es completo (especialmente en el manejo de errores) ni elegante; sin embargo, funcionará en la mayoría de las circunstancias.

def deltree(target):
    print("deltree", target)
    for d in os.listdir(target):
        try:
            deltree(target + "https://stackoverflow.com/" + d)
        except OSError:
            os.remove(target + "https://stackoverflow.com/" + d)

    os.rmdir(target)

avatar de usuario
Azat Ibrakov

El comando (dado por Tomek) no puedo eliminar un archivo, si es solo lectura. por lo tanto, uno puede usar –

import os, sys
import stat

def del_evenReadonly(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)

if  os.path.exists("test/qt_env"):
    shutil.rmtree('test/qt_env',onerror=del_evenReadonly)

  • al intentar eliminar su código con mi propia carpeta, aparece un error que dice: NameError: name 'stat' is not defined. ¿Cómo se ha definido?

    – nako

    30 de julio de 2018 a las 15:22

  • El módulo stat define constantes y funciones para interpretar los resultados de os.stat(), os.fstat() y os.lstat(). lo que puede intentar: importar sistema operativo, sistema de importación de estadísticas *

    – monir

    6 de agosto de 2018 a las 12:59


¿Ha sido útil esta solución?