Eliminar directorio en Python


shutil.rmtree no eliminará archivos de solo lectura en Windows. ¿Hay un equivalente en python de "rm-rf"? ¿Por qué oh por qué es esto un dolor?

Author: Brian Tompsett - 汤莱恩, 2009-12-11

6 answers

shutil.rmtree puede tomar una función de manejo de errores que se llamará cuando tenga problemas para eliminar un archivo. Puede usar eso para forzar la eliminación de los archivos problemáticos.

Inspirado en http://mail.python.org/pipermail/tutor/2006-June/047551.html y http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html :

import os
import stat
import shutil

def remove_readonly(func, path, excinfo):
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(top, onerror=remove_readonly)

(No he probado ese fragmento, pero debería ser suficiente para comenzar)

 39
Author: Steve Losh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-09 18:13:59

Si importa win32api desde PyWin32, puede usar:

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

Para hacer que los archivos dejen de ser de solo lectura.

 3
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-11 17:34:38

Otra forma es definir rmtree en Windows como

rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])
 3
Author: asmeurer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-12 15:49:52

Hay un comentario en el sitio de ActiveState que dice:

Shutil.rmtree tiene sus defectos. Aunque es cierto que puedes usar shutil.rmtree() en muchos casos, hay algunos casos en los que no funciona. Por ejemplo, los archivos marcados como de solo lectura en Windows no pueden ser eliminados por shutil.rmtree().

Importando los módulos win32api y win32con de PyWin32 y añadiendo una línea como "win32api.SetFileAttributes( path, win32con. FILE_ATTRIBUTE_NORMAL " to la función rmgeneric (), este obstáculo se puede superar. Usé este enfoque para arreglar el hot-backup.py script de Subversion 1.4 para que funcione bajo Windows. Gracias por la receta.

No uso Windows, así que no puedo verificar si esto funciona o no.

 2
Author: ire_and_curses,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-11 17:34:30

Aquí hay una variante de lo que Steve publicó, utiliza el mismo mecanismo básico, y este es probado: -)

¿Cómo se ejecutan los scripts de python en Windows?

 2
Author: ThomasH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:31

Esto probablemente se arreglará con la publicación de Python 3.5 (actualmente - junio de 2015 - todavía en desarrollo) en el sentido de dar una pista sobre esto en la documentación.

Puede encontrar el informe de error aquí. Y este es el conjunto de cambios de acuerdo.

Vea el ejemplo recién agregado de los documentos Python 3.5 :

import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onerror=remove_readonly)
 1
Author: mozzbozz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-16 10:23:01