Pregunta ¿Cómo elimino / elimino una carpeta que no está vacía con Python?


Recibo un error de "acceso denegado" cuando intento eliminar una carpeta que no está vacía. Usé el siguiente comando 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?


674
2017-11-19 20:15


origen


Respuestas:


import shutil

shutil.rmtree('/folder_name')

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, utilice

shutil.rmtree('/folder_name', ignore_errors=True)

1083
2017-11-19 20:23



De los documentos de python en os.walk():

# Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))

120
2017-11-19 20:23



import shutil
shutil.rmtree(dest, ignore_errors=True)

96
2017-08-07 00:59



desde python 3.4 puedes usar:

import pathlib

def delete_folder(pth) :
    for sub in pth.iterdir() :
        if sub.is_dir() :
            delete_folder(sub)
        else :
            sub.unlink()
    pth.rmdir() # if you just want to delete dir content, remove this line

dónde pth es un pathlib.Path ejemplo. Bien, pero puede que no sea el más rápido.


14
2018-03-03 14:23



import os
import stat
import shutil

def errorRemoveReadonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
        # change the file to be readable,writable,executable: 0777
        os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)  
        # retry
        func(path)
    else:
        # raiseenter code here

shutil.rmtree(path, ignore_errors=False, onerror=errorRemoveReadonly) 

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 para esa función que hizo que fallara; 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. Ingrese aquí el código


8
2018-02-12 11:58



Base en la respuesta de kkubasik, compruebe si existe una carpeta antes de eliminar, más robusto

import shutil
def remove_folder(path):
    # check if folder exists
    if os.path.exists(path):
         # remove if exists
         shutil.rmtree(path)
remove_folder("/folder_name")

5
2017-10-06 21:02



si está seguro de que desea eliminar todo el árbol de directorios y no le interesan más los contenidos de dir, entonces rastrear todo el árbol de directorios es una estupidez ... simplemente llame al comando nativo de SO de python para hacerlo. Será más rápido, eficiente y consumirá menos memoria.

RMDIR c:\blah /s /q 

o * nix

rm -rf /home/whatever 

En Python, el código se verá como ...

import sys
import os

mswindows = (sys.platform == "win32")

def getstatusoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    if not mswindows:
        return commands.getstatusoutput(cmd)
    pipe = os.popen(cmd + ' 2>&1', 'r')
    text = pipe.read()
    sts = pipe.close()
    if sts is None: sts = 0
    if text[-1:] == '\n': text = text[:-1]
    return sts, text


def deleteDir(path):
    """deletes the path entirely"""
    if mswindows: 
        cmd = "RMDIR "+ path +" /s /q"
    else:
        cmd = "rm -rf "+path
    result = getstatusoutput(cmd)
    if(result[0]!=0):
        raise RuntimeError(result[1])

5
2017-12-22 08:00



De docs.python.org:

Este ejemplo muestra cómo eliminar un árbol de directorios en Windows donde   algunos de los archivos tienen su bit de solo lectura configurado. Utiliza el onerror   devolución de llamada para borrar el bit de solo lectura y volver a intentar la eliminación. Alguna   la falla subsiguiente se propagará.

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)

4
2018-05-11 11:39



Solo algunas opciones de Python 3.5 para completar las respuestas anteriores. (Me hubiera encantado encontrarlos aquí).

import os
import shutil
from send2trash import send2trash # (shutil delete permanently)

Eliminar carpeta si está vacía

root = r"C:\Users\Me\Desktop\test"   
for dir, subdirs, files in os.walk(root):   
    if subdirs == [] and files == []:
           send2trash(dir)
           print(dir, ": folder removed")

Eliminar también la carpeta si contiene este archivo

    elif subdirs == [] and len(files) == 1: # if contains no sub folder and only 1 file 
        if files[0]== "desktop.ini" or:  
            send2trash(dir)
            print(dir, ": folder removed")
        else:
            print(dir)

eliminar carpeta si contiene solo archivos .srt o .txt

    elif subdirs == []: #if dir doesn’t contains subdirectory
        ext = (".srt", ".txt")
        contains_other_ext=0
        for file in files:
            if not file.endswith(ext):  
                contains_other_ext=True
        if contains_other_ext== 0:
                send2trash(dir)
                print(dir, ": dir deleted")

Eliminar carpeta si su tamaño es menor a 400kb:

def get_tree_size(path):
    """Return total size of files in given path and subdirs."""
    total = 0
    for entry in os.scandir(path):
        if entry.is_dir(follow_symlinks=False):
            total += get_tree_size(entry.path)
        else:
            total += entry.stat(follow_symlinks=False).st_size
    return total


for dir, subdirs, files in os.walk(root):   
    If get_tree_size(dir) < 400000:  # ≈ 400kb
        send2trash(dir)
    print(dir, "dir deleted")

3
2018-02-09 16:26