web-dev-qa-db-fra.com

Suppression de tous les fichiers d'un répertoire avec Python

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

127
slh2080

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 .

235
miku

Utilisez os.chdir pour changer de répertoire . Utilisez glob.glob pour générer une liste de noms de fichiers qui se termine 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 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)
23
unutbu

Dans Python 3.5, os.scandir est préférable si vous devez vérifier les attributs de fichier ou le type - voir os.DirEntry pour connaître les propriétés de l'objet renvoyé 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 chaque DirEntry inclut déjà le chemin complet du fichier. 

11
Yi Jiang

vous pouvez créer une fonction. Ajoutez maxdepth à votre guise pour parcourir des 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
ghostdog74

Premièrement glob them, puis unlink .

3

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

subprocess.run('rm /tmp/*.bak', Shell=True)
1
Vitaly Zdanevich

Je me rends compte que c'est vieux Cependant, voici comment procéder 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))
0
M.Markfort