Recibo un error de "acceso denegado" cuando intento eliminar una carpeta que no está vacía. He utilizado el comando siguiente en mi intento: os.remove("/folder_name")
.
¿Cuál es la forma más efectiva de eliminar / eliminar una carpeta / directorio que no está vacío?
rm -rf
comportamiento específico , ver: stackoverflow.com/questions/814167/…Respuestas:
Referencia de biblioteca estándar: shutil.rmtree .
Por diseño,
rmtree
falla en los árboles de carpetas que contienen archivos de solo lectura. Si desea que la carpeta se elimine independientemente de si contiene archivos de solo lectura, usefuente
rmtree
fallará si hay archivos de solo lectura: stackoverflow.com/questions/2656322/…De los documentos de Python en
os.walk()
:fuente
fuente
ignore_errors=True
resuelve el problemaonerror
parámetro se usa en lugar deignore_errors
. De esta forma, los archivos de solo lectura se eliminan en lugar de ignorarse.rmtree()
se ignora todo el método.desde python 3.4 puedes usar:
donde
pth
es unapathlib.Path
instancia Agradable, pero puede no ser el más rápido.fuente
Desde docs.python.org :
fuente
Si se establece ignore_errors, los errores se ignoran; de lo contrario, si se establece onerror, se llama para manejar el error con argumentos (func, path, exc_info) donde func es os.listdir, os.remove u os.rmdir; ruta es el argumento de esa función que causó su falla; y exc_info es una tupla devuelta por sys.exc_info (). Si ignore_errors es falso y onerror es None, se genera una excepción. Introduzca el código aquí
fuente
Base en la respuesta de kkubasik, verifique si la carpeta existe antes de eliminar, más robusta
fuente
try
eliminar y manejarexcept
que llamarexists()
primerosi está seguro de que desea eliminar todo el árbol de directorios y ya no está interesado en el contenido del directorio, entonces rastrear todo el árbol de directorios es una estupidez ... simplemente llame al comando nativo del sistema operativo desde Python para hacerlo. Será más rápido, eficiente y consumirá menos memoria.
o * nix
En python, el código se verá así ...
fuente
shutil.rmdir
es aislarlo del tipo de sistema operativo.Solo algunas opciones de Python 3.5 para completar las respuestas anteriores. (Me hubiera encantado encontrarlos aquí).
Eliminar carpeta si está vacía
Eliminar también la carpeta si contiene este archivo
eliminar carpeta si contiene solo archivos .srt o .txt
Eliminar carpeta si su tamaño es inferior a 400kb:
fuente
if files[0]== "desktop.ini" or:
Me gustaría agregar un enfoque de "pathlib puro":
Esto se basa en el hecho de que
Path
es ordenable, y las rutas más largas siempre se ordenarán después de las rutas más cortas, al igual questr
. Por lo tanto, los directorios vendrán antes que los archivos. Si invertimos el orden, los archivos aparecerán antes de sus respectivos contenedores, por lo que simplemente podemos desvincularlos / rmdirlos uno por uno con una sola pasada.Beneficios:
pathlib
promete en Python 3.6; ninguna operación mencionada anteriormente no se ejecuta en Windows)fuente
fuente
Si no desea usar el
shutil
módulo, simplemente puede usar elos
módulo.fuente
os.remove
no puede eliminar directorios, por lo que esto aumentaráOsError
sidirectoryToRemove
contiene subdirectorios.Diez años después y usando Python 3.7 y Linux todavía hay diferentes maneras de hacer esto:
Esencialmente está usando el módulo de subproceso de Python para ejecutar el script bash
$ rm -rf '/path/to/your/dir
como si estuviera usando el terminal para realizar la misma tarea. No es totalmente Python, pero lo hace.La razón por la que incluí el
pathlib.Path
ejemplo es porque, en mi experiencia, es muy útil cuando se trata de muchos caminos que cambian. Los pasos adicionales para importar elpathlib.Path
módulo y convertir los resultados finales en cadenas a menudo me cuestan menos tiempo de desarrollo. Sería conveniente siPath.rmdir()
viniera con una opción arg para manejar explícitamente directorios no vacíos.fuente
rmtree
y carpetas ocultas como.vscode
. Esta carpeta se detectó como archivo de texto y el error me dijo que este archivo erabusy
y no podía eliminarse.Para eliminar una carpeta, incluso si no existe (evitando la condición de carrera en la respuesta de Charles Chow ) pero aún tiene errores cuando otras cosas salen mal (por ejemplo, problemas de permisos, error de lectura del disco, el archivo no es un directorio)
Para Python 3.x:
El código Python 2.7 es casi el mismo:
fuente
Con os.walk propondría la solución que consiste en 3 llamadas Python de una línea:
El primer script chmod es todos los subdirectorios, el segundo script chmod es todos los archivos. Luego, el tercer script elimina todo sin impedimentos.
He probado esto desde el "Shell Script" en un trabajo de Jenkins (no quería almacenar un nuevo script de Python en SCM, por eso busqué una solución de una línea) y funcionó para Linux y Windows.
fuente
pathlib
, puede combinar los dos primeros pasos en uno:[p.chmod(0o666) for p in pathlib.Path(_path_).glob("**/*")]
Puede usar el comando os.system para simplificar:
Como es obvio, en realidad invoca la terminal del sistema para realizar esta tarea.
fuente
He encontrado una manera muy fácil de eliminar cualquier carpeta (incluso NO vacía) o archivo en el sistema operativo WINDOWS .
fuente
Para Windows, si el directorio no está vacío y tiene archivos de solo lectura u obtiene errores como
Access is denied
The process cannot access the file because it is being used by another process
Prueba esto,
os.system('rmdir /S /Q "{}"'.format(directory))
Es equivalente para
rm -rf
en Linux / Mac.fuente