Supprimer tous les fichiers d'un répertoire avec Python

147

Je souhaite supprimer tous les fichiers avec l'extension .bakdans un répertoire. Comment puis-je faire cela en Python?

slh2080
la source
5
@ slh2080: Publier "Résolu" n'est pas ce que vous faites sur ce site. Ce que vous faites est de choisir la réponse que vous avez réellement utilisée et cliquez sur la coche pour indiquer que cela a résolu votre problème.
S.Lott
1
Désolé. Merci d'avoir signalé mon erreur. Ce ne sont pas des devoirs, j'apprends juste Python pendant mon temps libre. J'ai cliqué sur la réponse que j'ai utilisée mais c'était avant de voir la réponse de ghostdog74.
slh2080
Remarque: pour supprimer une arborescence de répertoires entière shutil.rmtree(path)pourrait être utilisé .
jfs

Réponses:

270

Via os.listdiret os.remove:

import os

filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ]
for f in filelist:
    os.remove(os.path.join(mydir, f))

Ou via glob.glob:

import glob, os, os.path

filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
    os.remove(f)

Assurez-vous d'être dans le bon répertoire, en utilisant éventuellement os.chdir.

Miku
la source
21
Votre premier exemple utilise des boucles for redondantes. Vous pouvez passer avec - [os.remove (f) pour f dans os.listdir (".") Si f.endswith (". Bak")] - car les compréhensions de liste sont destinées à être utilisées. Ou vous pouvez déplacer le 'if' de la compréhension dans la boucle for - for f dans os.listdir ("."): If f.endswith (". Bak"): os.remove (f)
dragonjujo
@ slh2080 Puisque vous dites que le problème a été résolu, pourquoi ne pas marquer la réponse comme la bonne réponse?
blwy10
5
Attention au os.listdir (".") !!! J'ai utilisé ce code et j'ai oublié de changer le chemin, tout mon code avait disparu !!! J'ai essayé deux utilitaires différents pour récupérer mais sans chance !!
Lei Guo
@LeiGuo a corrigé cela.
yugr
26

Utilisez os.chdirpour changer de répertoire. Utilisez glob.globpour générer une liste de noms de fichiers qui le terminent «.bak». Les éléments de la liste ne sont que des chaînes.

Ensuite, vous pouvez utiliser os.unlinkpour supprimer les fichiers. (PS. os.unlinkEt os.removesont des synonymes de la même fonction.)

#!/usr/bin/env python
import glob
import os
directory='/path/to/dir'
os.chdir(directory)
files=glob.glob('*.bak')
for filename in files:
    os.unlink(filename)
unutbu
la source
18

Dans Python 3.5, il os.scandirest préférable de vérifier les attributs ou le type de fichier - voir les os.DirEntrypropriétés de l'objet retourné par la fonction.

import os 

for file in os.scandir(path):
    if file.name.endswith(".bak"):
        os.unlink(file.path)

Cela ne nécessite pas non plus de changer de répertoire car chacun DirEntrycomprend déjà le chemin complet du fichier.

Yi Jiang
la source
Il vous manque un deux-points, la première ligne à l'intérieur de la boucle for devrait êtreif file.name.endswith(".bak"):
TSeymour
Merci! Cela m'apprendra à écrire du code sans les exécuter
Yi Jiang
8

vous pouvez créer une fonction. Ajoutez maxdepth comme vous le souhaitez pour parcourir les sous-répertoires.

def findNremove(path,pattern,maxdepth=1):
    cpath=path.count(os.sep)
    for r,d,f in os.walk(path):
        if r.count(os.sep) - cpath <maxdepth:
            for files in f:
                if files.endswith(pattern):
                    try:
                        print "Removing %s" % (os.path.join(r,files))
                        #os.remove(os.path.join(r,files))
                    except Exception,e:
                        print e
                    else:
                        print "%s removed" % (os.path.join(r,files))

path=os.path.join("/home","dir1","dir2")
findNremove(path,".bak")
ghostdog74
la source
1

Sous Linux et macOS, vous pouvez exécuter une commande simple sur le shell:

subprocess.run('rm /tmp/*.bak', shell=True)
Vitaly Zdanevich
la source
3
Pas un bon choix à mon avis. Ce n'est pas portable et c'est probablement plus cher en raison du sous-processus supplémentaire. Mieux vaut utiliser les API Python.
Haakon
0

Je me rends compte que c'est vieux; cependant, voici comment le faire en utilisant uniquement le module os ...

def purgedir(parent):
    for root, dirs, files in os.walk(parent):                                      
        for item in files:
            # Delete subordinate files                                                 
            filespec = os.path.join(root, item)
            if filespec.endswith('.bak'):
                os.unlink(filespec)
        for item in dirs:
            # Recursively perform this operation for subordinate directories   
            purgedir(os.path.join(root, item))
M.Markfort
la source