Comment puis-je supprimer/supprimer un dossier qui n'est pas vide avec Python?

je reçois un 'accès refusé' erreur lorsque je tente 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 n'est pas vide?

691
demandé sur Sinister Beard 2008-11-19 23:15:38
la source

15 ответов

import shutil

shutil.rmtree('/folder_name')

de la Bibliothèque Standard de Référence: shutil.rmtree .

de Par sa conception, rmtree échoue sur les arborescences de dossiers contenant des fichiers en lecture seule. Si vous voulez que le dossier soit supprimé, qu'il contienne ou non des fichiers en lecture seule, utilisez

shutil.rmtree('/folder_name', ignore_errors=True)
1105
répondu ddaa 2018-02-23 15:04:08
la source

à Partir de le python docs 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))
122
répondu kkubasik 2012-06-21 00:00:13
la source
import shutil
shutil.rmtree(dest, ignore_errors=True)
98
répondu Siva Mandadi 2014-08-07 04:59:15
la source

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 une instance pathlib.Path . Sympa, mais peut-être pas le plus rapide.

15
répondu yota 2016-04-07 09:52:15
la source
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 défini, il est appelé à gérer l'erreur avec des arguments (func, path, exc_info) où func est os.listdir, os.supprimer, ou de l'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 soulevée.entrer le code ici

8
répondu RongyanZheng 2017-12-20 03:49:38
la source

si vous êtes sûr, que vous voulez supprimer l'arbre dir entier, et ne sont plus intéressés par le contenu de dir, alors ramper pour l'arbre dir entier est stupidité... il suffit d'appeler la commande native OS de python pour le faire. Il sera plus rapide, efficace et consommera moins de 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])
6
répondu P M 2016-01-12 14:49:50
la source

sur la base de la réponse de kubasik, vérifiez 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
répondu Charles Chow 2015-10-07 00:07:20
la source

de docs.python.org :

cet exemple montre comment supprimer un arbre de répertoire sur Windows où certains fichiers ont leur bit en lecture seule. Il utilise l'onerror callback pour effacer le bit de lecture et réessayer la suppression. Tout défaillance de propagation.

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
répondu Dave Chandler 2017-05-11 14:39:26
la source

si vous ne voulez pas utiliser le module shutil , vous pouvez simplement utiliser le module os .

from os import listdir, rmdir, remove
for i in listdir(directoryToRemove):
    os.remove(os.path.join(directoryToRemove, i))
rmdir(directoryToRemove) # Now the directory is empty of files
4
répondu Byron Filer 2017-09-11 08:37:45
la source

juste quelques options python 3.5 pour compléter les réponses ci-dessus. (J'aurais aimé le trouver ici).

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

Supprimer dossier si vide

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")

Supprimer aussi le dossier s'il contient ce fichier

    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)

supprimer le dossier s'il contient seulement .srt ou .txt fichier(s)

    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")

Supprimer dossier si sa taille est inférieure à 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
répondu JinSnow 2017-06-28 18:07:56
la source

vous pouvez utiliser os.commande système pour la simplicité:

import os
os.system("rm -rf dirname")

comme évident, il invoque en fait système terminal pour accomplir cette tâche.

1
répondu 2016-01-11 07:46:15
la source

pour supprimer un dossier même s'il n'existe pas (en évitant la condition de race dans réponse de Charles Chow ) mais ont encore des erreurs quand d'autres choses vont mal (par exemple, problèmes de permission, erreur de lecture de disque, le fichier n'est pas un répertoire)

Pour Python 3.x:

import shutil

def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, FileNotFoundError):
        return
    raise except_instance

shutil.rmtree(dir_to_delete, onerror=ignore_absent_file)

le code python 2.7 est presque le même:

import shutil
import errno

def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, OSError) and \
        except_instance.errno == errno.ENOENT:
        return
    raise except_instance

shutil.rmtree(dir_to_delete, onerror=ignore_absent_file)
1
répondu Eponymous 2017-05-28 20:53:09
la source
def deleteDir(dirPath):
    deleteFiles = []
    deleteDirs = []
    for root, dirs, files in os.walk(dirPath):
        for f in files:
            deleteFiles.append(os.path.join(root, f))
        for d in dirs:
            deleteDirs.append(os.path.join(root, d))
    for f in deleteFiles:
        os.remove(f)
    for d in deleteDirs:
        os.rmdir(d)
    os.rmdir(dirPath)
1
répondu amazingthere 2017-08-03 11:24:56
la source

j'ai trouvé un moyen très facile de supprimer n'importe quel dossier (même pas vide) ou fichier sur Windows OS .

os.system('powershell.exe  rmdir -r D:\workspace\Branches\*%s* -Force' %CANDIDATE_BRANCH)
1
répondu seremet 2018-06-01 18:29:47
la source

avec os.walk I proposerait la solution qui consiste en 3 appels de Python à une seule doublure:

python -c "import sys; import os; [os.chmod(os.path.join(rs,d), 0o777) for rs,ds,fs in os.walk(_path_) for d in ds]"
python -c "import sys; import os; [os.chmod(os.path.join(rs,f), 0o777) for rs,ds,fs in os.walk(_path_) for f in fs]"
python -c "import os; import shutil; shutil.rmtree(_path_, ignore_errors=False)"

Le premier script chmod de tous les sous-répertoires, le second script chmod de tous les fichiers. Puis le troisième script supprime tout sans obstacles.

j'ai testé cela à partir du "Shell Script" dans un travail de Jenkins (Je ne voulais pas stocker un nouveau script Python dans SCM, c'est pourquoi j'ai cherché une solution en une seule ligne) et cela a fonctionné pour Linux et Windows.

1
répondu Alexander Samoylov 2018-07-23 18:32:36
la source

Autres questions sur python file