Eliminando carpetas en python recursivamente

Estoy teniendo 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 paso el directorio donde se debe hacer 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 borran! Pero las carpetas 25 y 26 no se eliminan, a pesar de que son 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?

Prueba shutil.rmtree :

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

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

Intente rmtree en shutil . en python std library

Un poco tarde para el show, pero aquí está mi directorio único de Pathlib.

 def rmdir(dir): dir = Path(dir) for item in dir.iterdir(): if item.is_dir(): rmdir(item) else: item.unlink() dir.rmdir() rmdir(pathlib.Path("dir/")) 

es mejor usar la ruta absoluta e importar solo la función rmtree from shutil import rmtree ya que este es un paquete grande. La línea anterior solo importará la función requerida.

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

Solo para el siguiente tipo que busque una solución de micropython, esto funciona puramente basado en os (listdir, remove, rmdir). No es ni 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 + '/' + d) except OSError: os.remove(target + '/' + d) os.rmdir(target) 

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

 import os, sys from stat import * 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) 

Aquí hay una solución recursiva:

 def clear_folder(dir): if os.path.exists(dir): for the_file in os.listdir(dir): file_path = os.path.join(dir, the_file) try: if os.path.isfile(file_path): os.unlink(file_path) else: clear_folder(file_path) os.rmdir(file_path) except Exception as e: print(e)