Comment supprimer le contenu d'un dossier en Python?
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)
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, sionerror
est défini, il est appelé à gérer l'erreur avec arguments(func, path, exc_info)
oùfunc
estos.listdir
,os.remove
, ouos.rmdir
; le chemin est l'argument à cela fonction qui a causé sa défaillance;exc_info
est un tuple retourné parsys.exc_info()
. Siignore_errors
est false etonerror
estNone
, un l'exception est levée.
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.
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))
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)
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)) )
Note: dans le cas où quelqu'un en bas voté de ma réponse, j'ai quelque chose à expliquer ici.
- tout le monde aime les réponses courtes et simples. Cependant, parfois, la réalité n'est pas si simple.
- 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é parshutil.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) . - 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 avecos.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). - 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 testos.path.isdir()
s'il renvoie à un répertoire; même le résultat deos.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")
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.
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.
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)
j'ai utilisé pour résoudre le problème de cette façon:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
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))
Encore Une Autre Solution:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
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)
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)
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
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.
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!