Eliminazione di tutti i file in una directory con Python


147

Voglio eliminare tutti i file con l'estensione .bakin una directory. Come posso farlo in Python?


5
@ slh2080: Pubblicare "Risolto" non è quello che fai su questo sito. Quello che fai è scegliere la risposta che hai effettivamente utilizzato e fare clic sul segno di spunta per indicare che ha risolto il problema.
S.Lott

1
Scusate. Grazie per aver segnalato il mio errore. Non sono compiti, sto solo imparando il pitone nel mio tempo libero. Ho cliccato sulla risposta che ho usato, ma prima che vedessi la risposta ghostdog74.
slh2080,

nota: per eliminare un intero albero di directory shutil.rmtree(path)potrebbe essere utilizzato .
jfs,

Risposte:


270

Via os.listdire 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))

O via glob.glob:

import glob, os, os.path

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

Assicurati di essere nella directory corretta, eventualmente utilizzando os.chdir.


21
Il tuo primo esempio sta usando ridondante per i loop. Puoi passare con - [os.remove (f) per f in os.listdir (".") Se f.endswith (". Bak")] - poiché si intende utilizzare la comprensione dell'elenco. Oppure puoi spostare 'if' nella comprensione nel ciclo for - for f in os.listdir ("."): If f.endswith (". Bak"): os.remove (f)
dragonjujo

@ slh2080 Dato che dici che il problema è stato risolto, perché non contrassegnare la risposta come risposta corretta?
blwy10

5
Fai attenzione a os.listdir (".") !!! Ho usato questo codice e ho dimenticato di cambiare il percorso, tutto il mio codice era sparito !!! Ho provato due diverse utility per recuperare ma senza fortuna !!
Lei Guo,

@LeiGuo Risolto questo.
yugr

26

Utilizzare os.chdirper cambiare directory. Utilizzare glob.globper generare un elenco di nomi di file che terminano con ".bak". Gli elementi dell'elenco sono solo stringhe.

Quindi è possibile utilizzare os.unlinkper rimuovere i file. (PS. os.unlinkE os.removesono sinonimi per la stessa funzione.)

#!/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)

18

In Python 3.5, os.scandirè meglio se è necessario controllare gli attributi o il tipo di file: vedere le os.DirEntryproprietà dell'oggetto restituito dalla funzione.

import os 

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

Ciò non richiede inoltre la modifica delle directory poiché ognuna DirEntryinclude già l'intero percorso del file.


Ti manca un punto, la prima riga all'interno del ciclo for dovrebbe essereif file.name.endswith(".bak"):
TSeymour

Grazie! Questo mi insegnerà a scrivere il codice senza eseguirli effettivamente
Yi Jiang

8

puoi creare una funzione. Aggiungi maxdepth a piacere per attraversare le sottodirectory.

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


1

Su Linux e macOS è possibile eseguire un semplice comando sulla shell:

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

3
Non è una buona scelta secondo me. Non è portatile ed è probabilmente più costoso a causa del sottoprocesso aggiuntivo. Meglio usare le API di Python.
Haakon,

0

Mi rendo conto che questo è vecchio; tuttavia, ecco come farlo usando solo il modulo 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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.