Comment supprimer le contenu d'un dossier en Python?

Comment puis-je supprimer le contenu d'un dossier local en Python?

le projet actuel est Pour Windows, mais je voudrais voir aussi *nix.

298
demandé sur nbro 2008-10-09 08:22:33

18 réponses

mis à jour pour supprimer uniquement les fichiers et utiliser le système d'exploitation.chemin.join () méthode suggérée dans les commentaires. Si vous voulez aussi supprimer des sous-répertoires, décommentez la déclaration elif.

import os, shutil
folder = '/path/to/folder'
for the_file in os.listdir(folder):
    file_path = os.path.join(folder, the_file)
    try:
        if os.path.isfile(file_path):
            os.unlink(file_path)
        #elif os.path.isdir(file_path): shutil.rmtree(file_path)
    except Exception as e:
        print(e)
272
répondu Nick Stinemates 2016-03-30 16:40:00

essayer le module shutil

import shutil
shutil.rmtree('/path/to/folder')

Description: shutil.rmtree(path, ignore_errors=False, onerror=None)

Docstring: supprimer récursivement un l'arborescence de répertoire.

Si ignore_errors est défini, les erreurs sont ignoré; sinon, si onerror est défini, il est appelé à gérer l'erreur avec arguments (func, path, exc_info)func est os.listdir , os.remove , ou os.rmdir ; le chemin est l'argument à cela fonction qui a causé sa défaillance; exc_info est un tuple retourné par sys.exc_info() . Si ignore_errors est false et onerror est None , un l'exception est levée.

186
répondu Oli 2017-02-28 15:12:11

vous pouvez simplement faire ceci:

import os
import glob

files = glob.glob('/YOUR/PATH/*')
for f in files:
    os.remove(f)

vous pouvez bien sûr utiliser un autre filtre dans votre chemin, par exemple : /YOU/PATH/*.txt pour supprimer tous les fichiers texte dans un répertoire.

146
répondu Blueicefield 2018-07-04 10:03:47

développer la réponse de mhawke voici ce que j'ai mis en œuvre. Il supprime tout le contenu d'un dossier mais pas le dossier lui-même. Testé sur Linux avec des fichiers, des dossiers et des liens symboliques, devrait fonctionner sur Windows.

import os
import shutil

for root, dirs, files in os.walk('/path/to/folder'):
    for f in files:
        os.unlink(os.path.join(root, f))
    for d in dirs:
        shutil.rmtree(os.path.join(root, d))
65
répondu Iker Jimenez 2009-07-02 10:49:42

utiliser rmtree et recréer le dossier pourrait fonctionner, mais j'ai couru dans des erreurs lors de la suppression et immédiatement recréer des dossiers sur des disques réseau.

la solution proposée en utilisant walk ne fonctionne pas car il utilise rmtree pour supprimer des dossiers et puis peut tenter d'utiliser os.unlink sur les fichiers qui étaient auparavant dans ces dossiers. Cela provoque une erreur.

la solution affichée glob tentera également de supprimer dossiers non vides, provoquant des erreurs.

je vous suggère d'utiliser:

folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
    file_object_path = os.path.join(folder_path, file_object)
    if os.path.isfile(file_object_path):
        os.unlink(file_object_path)
    else:
        shutil.rmtree(file_object_path)
43
répondu jgoeders 2015-09-07 13:34:51

comme oneliner:

import os

# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )

# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )

une solution plus robuste pour comptabiliser les fichiers et les répertoires serait aussi (2.7):

def rm(f):
    if os.path.isdir(f): return os.rmdir(f)
    if os.path.isfile(f): return os.unlink(f)
    raise TypeError, 'must be either file or directory'

map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
14
répondu fmonegaglia 2016-11-29 14:04:15

Note: dans le cas où quelqu'un en bas voté de ma réponse, j'ai quelque chose à expliquer ici.

  1. tout le monde aime les réponses courtes et simples. Cependant, parfois, la réalité n'est pas si simple.
  2. Retour à ma réponse. Je sais que shutil.rmtree() peut être utilisé pour supprimer une arborescence de répertoires. Je l'ai utilisé plusieurs fois dans mes propres projets. Mais vous devez vous rendre compte que le répertoire lui-même sera également supprimé par shutil.rmtree() . Bien que cela puisse être acceptable pour certains, ce n'est pas une réponse valide pour supprimer le contenu d'un dossier (sans effets secondaires) .
  3. je vais vous montrer un exemple des effets secondaires. Supposons que vous ayez un répertoire avec personnalisé propriétaire et mode bits, où il y a beaucoup de contenu. Puis vous le supprimez avec shutil.rmtree() et vous le reconstruisez avec os.mkdir() . Et vous aurez un répertoire vide avec défaut (hérité) propriétaire et mode bits à la place. Alors que vous pourriez avoir le privilège de supprimer le contenu et même le répertoire, vous pourriez ne pas être en mesure de mettre en arrière le propriétaire d'origine et le mode bits sur le répertoire (par exemple, vous n'êtes pas un super-utilisateur).
  4. enfin, soyez patient et lisez le code . Il est long et laid (en vue), mais s'est avéré fiable et efficace (en usage).

Voici une solution longue et moche, mais fiable et efficace.

il résout quelques problèmes qui ne sont pas abordés par les autres répondants:

  • il gère correctement les liens symboliques, y compris ne pas appeler shutil.rmtree() sur un lien symbolique (qui passera le test os.path.isdir() s'il renvoie à un répertoire; même le résultat de os.walk() contient des répertoires liés symboliques ainsi).
  • il gère bien les fichiers en lecture seule.

voici le code (la seule fonction utile est clear_dir() ):

import os
import stat
import shutil


# /q/deleting-directory-in-python-61732/"Cannot call clear_dir() on a symbolic link")
13
répondu Rockallite 2014-09-03 12:10:19

C'est la seule réponse jusqu'à présent, dont:

  • supprime tous les liens symboliques
    • liens morts
    • liens aux répertoires
    • liens aux fichiers
  • supprime les sous-répertoires
  • ne supprime pas le répertoire parent

Code:

for filename in os.listdir(dirpath):
    filepath = os.path.join(dirpath, filename)
    try:
        shutil.rmtree(filepath)
    except OSError:
        os.remove(filepath)

Comme beaucoup d'autres réponses, ceci n'essaie pas d'ajuster les permissions pour permettre la suppression des fichiers/répertoires.

9
répondu Jon Chu 2016-05-09 15:06:04

vous devriez utiliser os.walk() pour ça.

os.listdir() ne distingue pas les fichiers des répertoires et vous allez rapidement avoir des problèmes en essayant de les découpler. Il existe un bon exemple d'utilisation de os.walk() pour supprimer de façon récursive un répertoire ici , et des conseils sur la façon de l'adapter à vos circonstances.

8
répondu mhawke 2008-10-09 05:52:54
import os
import shutil

# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]

# Iterate and remove each item in the appropriate manner
[os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]

un commentaire antérieur mentionne également l'utilisation de os.scandir en Python 3.5+. Par exemple:

import os
import shutil

with os.scandir(target_dir) as entries:
    for entry in entries:
        if entry.is_file() or entry.is_symlink():
            os.remove(entry.path)
        elif entry.is_dir():
            shutil.rmtree(entry.path)
8
répondu Jacob Wan 2017-02-08 01:33:48

j'ai utilisé pour résoudre le problème de cette façon:

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)
7
répondu ProfHase85 2013-06-17 11:52:24

je sais que c'est un vieux fil, mais j'ai trouvé quelque chose d'intéressant sur le site officiel de python. Juste pour partager une autre idée pour supprimer tous les contenus d'un répertoire. Parce que j'ai des problèmes d'autorisation lors de l'utilisation de shutil.rmtree() et je ne veux pas supprimer le répertoire et de le recréer. L'adresse originale est http://docs.python.org/2/library/os.html#os.walk . L'espoir qui pourrait aider quelqu'un.

def emptydir(top):
    if(top == '/' or top == "\"): return
    else:
        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))
6
répondu Sawyer 2015-06-11 08:40:40

Encore Une Autre Solution:

import sh
sh.rm(sh.glob('/path/to/folder/*'))
5
répondu Robin Winslow 2014-05-12 16:33:30

j'ai résolu le problème d'erreur avec rmtree makedirs en ajoutant du temps.sleep() entre les deux.

if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)

time.sleep(.5)

os.makedirs(folder_location, 0o777)
2
répondu physlexic 2017-05-03 16:52:47

si vous utilisez un système * nix, pourquoi ne pas utiliser la commande system?

import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
1
répondu silverbullettt 2018-06-12 12:22:02

réponse à une situation limitée et spécifique: en supposant que vous voulez supprimer les fichiers tout en maintenant l'arbre des sous-dossiers, vous pouvez utiliser un algorithme récursif:

import os

def recursively_remove_files(f):
    if os.path.isfile(f):
        os.unlink(f)
    elif os.path.isdir(f):
        map(recursively_remove_files, [os.path.join(f,fi) for fi in os.listdir(f)])

recursively_remove_files(my_directory)

peut-être légèrement hors sujet, mais je pense que beaucoup le trouveraient utile

0
répondu fmonegaglia 2016-12-27 10:55:07

en supposant que temp_dir soit supprimé, une commande d'une seule ligne utilisant os serait:

_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]

Note: il s'agit seulement d'un 1-liner pour supprimer des fichiers' ne supprime pas les répertoires.

Espérons que cette aide. Grâce.

0
répondu End-2-End 2018-10-05 02:03:20

cela devrait faire l'affaire en utilisant simplement le module OS pour lister et ensuite supprimer!

import os
DIR = os.list('Folder')
for i in range(len(DIR)):
    os.remove('Folder'+chr(92)+i)

a travaillé pour moi, n'importe quels problèmes faites le moi savoir!

-2
répondu B. Filer 2016-06-20 15:52:45