Question Comment supprimer / supprimer un dossier qui n'est pas vide avec Python?


Je reçois une erreur «Accès refusé» lorsque j'essaie de supprimer un dossier qui n'est pas vide. J'ai utilisé la commande suivante dans ma tentative: os.remove("/folder_name").

Quel est le moyen le plus efficace de supprimer / supprimer un dossier / répertoire qui n'est pas vide?


674
2017-11-19 20:15


origine


Réponses:


import shutil

shutil.rmtree('/folder_name')

Référence bibliothèque standard: shutil.rmtree.

Intentionnellement, rmtree échoue sur les arborescences de dossiers contenant des fichiers en lecture seule. Si vous souhaitez que le dossier soit supprimé, qu'il contienne des fichiers en lecture seule, utilisez

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

1083
2017-11-19 20:23



De les docs python sur 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



à partir de python 3.4, vous pouvez utiliser:

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

pth est un pathlib.Path exemple. Sympa, mais peut-être pas le plus rapide.


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 ignore_errors est défini, les erreurs sont ignorées. sinon, si onerror est positionné, il est appelé pour gérer l'erreur avec les arguments (func, path, exc_info) où func est os.listdir, os.remove, ou os.rmdir; path est l'argument de cette fonction qui l'a fait échouer; et exc_info est un tuple retourné par sys.exc_info (). Si ignore_errors est false et onerror est None, une exception est raise.enter code ici


8
2018-02-12 11:58



Base sur la réponse de kkubasik, vérifier si le dossier existe avant de supprimer, plus robuste

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 vous êtes sûr, que vous voulez supprimer tout l'arbre de dir, et que vous n'êtes plus intéressé par le contenu de dir, alors ramper pour l'arbre de dir entier est stupide ... il suffit d'appeler la commande native de OS de python. Ce sera plus rapide, efficace et moins gourmand en mémoire.

RMDIR c:\blah /s /q 

ou * nix

rm -rf /home/whatever 

En python, le code ressemblera à ..

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