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 -rfcomportamiento específico , ver: stackoverflow.com/questions/814167/…Respuestas:
Referencia de biblioteca estándar: shutil.rmtree .
Por diseño,
rmtreefalla 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
rmtreefallará si hay archivos de solo lectura: stackoverflow.com/questions/2656322/…De los documentos de Python en
os.walk():fuente
fuente
ignore_errors=Trueresuelve el problemaonerrorpará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
pthes unapathlib.Pathinstancia 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
tryeliminar y manejarexceptque 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.rmdires 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
Pathes 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:
pathlibpromete en Python 3.6; ninguna operación mencionada anteriormente no se ejecuta en Windows)fuente
fuente
Si no desea usar el
shutilmódulo, simplemente puede usar elosmódulo.fuente
os.removeno puede eliminar directorios, por lo que esto aumentaráOsErrorsidirectoryToRemovecontiene 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/dircomo 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.Pathejemplo es porque, en mi experiencia, es muy útil cuando se trata de muchos caminos que cambian. Los pasos adicionales para importar elpathlib.Pathmó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
rmtreey carpetas ocultas como.vscode. Esta carpeta se detectó como archivo de texto y el error me dijo que este archivo erabusyy 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 deniedThe process cannot access the file because it is being used by another processPrueba esto,
os.system('rmdir /S /Q "{}"'.format(directory))Es equivalente para
rm -rfen Linux / Mac.fuente