Löschen aller Dateien in einem Verzeichnis mit Python

147

Ich möchte alle Dateien mit der Erweiterung .bakin einem Verzeichnis löschen . Wie kann ich das in Python machen?

slh2080
quelle
5
@ slh2080: Das Posten von "Gelöst" ist nicht das, was Sie auf dieser Site tun. Wählen Sie die Antwort aus, die Sie tatsächlich verwendet haben, und klicken Sie auf das Häkchen, um anzuzeigen, dass das Problem dadurch behoben wurde.
S.Lott
1
Es tut uns leid. Vielen Dank, dass Sie auf meinen Fehler hingewiesen haben. Es sind keine Hausaufgaben, nur Python in meiner Freizeit zu lernen. Ich habe auf die Antwort geklickt, die ich verwendet habe, aber das war, bevor ich die Antwort von ghostdog74 sah.
slh2080
Hinweis: Zum Löschen eines gesamten Verzeichnisbaums shutil.rmtree(path)kann verwendet werden .
JFS
Mögliches Duplikat von Wie lösche ich den Inhalt eines Ordners in Python?
FabioSpaghetti

Antworten:

269

Über os.listdirund 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))

Oder über glob.glob:

import glob, os, os.path

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

Stellen Sie sicher, dass Sie sich im richtigen Verzeichnis befinden und eventuell verwenden os.chdir.

miku
quelle
21
Ihr erstes Beispiel ist die Verwendung von redundanten for-Schleifen. Sie können mit - [os.remove (f) für f in os.listdir (".") Durchgehen, wenn f.endswith (". Bak")] - als Listenverständnis verwendet werden soll. Oder Sie können das 'if' im Verständnis in die for-Schleife verschieben - für f in os.listdir ("."): If f.endswith (". Bak"): os.remove (f)
dragonjujo
@ slh2080 Da Sie sagen, dass das Problem behoben wurde, markieren Sie die Antwort als die richtige Antwort.
blwy10
5
Achten Sie auf die os.listdir (".") !!! Ich habe diesen Code verwendet und vergessen, den Pfad zu ändern, mein gesamter Code war weg !!! Versuchte zwei verschiedene Dienstprogramme, um sich zu erholen, aber ohne Glück !!
Lei Guo
@LeiGuo Das wurde behoben.
yugr
26

Verwenden Sie os.chdirdiese Option , um das Verzeichnis zu wechseln. Verwenden glob.globSie diese Option, um eine Liste mit Dateinamen zu erstellen, die mit '.bak' enden. Die Elemente der Liste sind nur Zeichenfolgen.

Dann können Sie os.unlinkdie Dateien entfernen. (PS. os.unlinkUnd os.removesind Synonyme für die gleiche Funktion.)

#!/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
quelle
18

In Python 3.5 os.scandirist es besser, wenn Sie nach Dateiattributen oder -typen suchen müssen - siehe os.DirEntryEigenschaften des Objekts, das von der Funktion zurückgegeben wird.

import os 

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

Dies erfordert auch kein Ändern der Verzeichnisse, da jedes DirEntrybereits den vollständigen Pfad zur Datei enthält.

Yi Jiang
quelle
Sie vermissen einen Doppelpunkt, die erste Zeile in der for-Schleife sollte seinif file.name.endswith(".bak"):
TSeymour
Vielen Dank! Das wird mich lehren, Code zu schreiben, ohne sie tatsächlich auszuführen
Yi Jiang
8

Sie können eine Funktion erstellen. Fügen Sie maxdepth hinzu, wie Sie möchten, um Unterverzeichnisse zu durchlaufen.

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
quelle
1

Unter Linux und MacOS können Sie einen einfachen Befehl für die Shell ausführen:

subprocess.run('rm /tmp/*.bak', shell=True)
Vitaly Zdanevich
quelle
3
Meiner Meinung nach keine gute Wahl. Es ist nicht tragbar und aufgrund des zusätzlichen Teilprozesses wahrscheinlich teurer. Besser Python-APIs verwenden.
Haakon
0

Mir ist klar, dass das alt ist; Hier erfahren Sie jedoch, wie Sie dies nur mit dem OS-Modul tun können ...

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
quelle