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?


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

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.


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)

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.


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


1

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

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

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))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.