2010-01-03 4 views
123

Je souhaite supprimer tous les fichiers portant l'extension .bak dans un répertoire. Comment puis-je faire ça en Python?Suppression de tous les fichiers dans un répertoire avec Python

+5

@ slh2080: affichage "Résolu" est ce que vous faites sur ce site. Qu'est-ce que vous faites est de choisir la réponse que vous avez réellement utilisé et cliquez sur la coche pour indiquer qu'il a résolu votre problème. –

+0

Désolé. Merci d'avoir signalé mon erreur. Ce n'est pas un devoir, j'apprends Python pendant mon temps libre. J'ai cliqué sur la réponse que j'ai utilisée mais c'était avant que j'aie vu la réponse de ghostdog74. – slh2080

+0

note: pour supprimer un arbre de répertoire entier ['shutil.rmtree (chemin)' pourrait être utilisé] (https://docs.python.org/3/library/shutil.html#shutil.rmtree). – jfs

Répondre

221

Via os.listdir et 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.

+16

Votre premier exemple utilise des boucles redondantes. Vous pouvez passer avec - [os.remove (f) pour f dans os.listdir (".") Si f.endswith (". Bak")] - comme compréhensions de liste sont destinés à être utilisés. Ou vous pouvez déplacer le 'si' dans la compréhension dans la boucle for - pour f dans os.listdir ("."): si f.endswith (". Bak"): os.remove (f) – dragonjujo

+0

@ 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

+4

@dragonjujo, oui je sais, mais je pensais que ce serait plus clair de cette façon .. – miku

23

Utilisez os.chdir pour changer de répertoire. Utilisez glob.glob pour générer une liste de noms de fichiers qui se terminent par '.bak'. Les éléments de la liste ne sont que des chaînes.

Ensuite, vous pouvez utiliser os.unlink pour supprimer les fichiers. (PS. os.unlink et os.remove sont 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) 
6

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

En Python 3.5, os.scandir est mieux si vous avez besoin de vérifier les attributs de fichier ou le type - voir os.DirEntry pour les propriétés de l'objet qui est 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 de changer les répertoires puisque chaque DirEntry comprend déjà le chemin complet vers le fichier.

+0

Il vous manque un deux-points, la première ligne à l'intérieur de la boucle for devrait être 'if file.name.endswith (". Bak "):' – TSeymour

+0

Merci!Ça va m'apprendre à écrire du code sans vraiment les exécuter –

0

Sur Linux et Mac OS, vous pouvez exécuter simple commande au shell:

subprocess.run('rm /tmp/*.bak', shell=True) 
+0

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

Questions connexes