Alte Dateien Löschen

Code-Stücke können hier veröffentlicht werden.
Antworten
RSMVDL

Wer z.B. Einen bestimmten Ordner nach alten Datein durchcrawlen um diese zu löschen kann das mit folgendem Script machen (Funkt unter Linux und Windows):

Code: Alles auswählen

import sys, os, time
path="D:/DUMPS"
for root, subFolders, files in os.walk(path):
    for file in files:
        fullpath=os.path.join(root,file)
        ftime = os.path.getmtime(fullpath)
        print (fullpath)
        print (ftime)
        curtime = time.time()
        difftime = curtime - ftime
        if difftime > 604800: #1 Woche in sek.
            os.remove(fullpath)
        else:
            print ("Probleme bei der Ausfuerung")
            break
        exit
Zuletzt geändert von Hyperion am Montag 15. April 2013, 19:29, insgesamt 1-mal geändert.
Grund: Code in Python-Code-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hm... da ist einiges eher unschön.

- Code auf Modulebene! Wieso gibt es keine main-Funktion, in der Dinge wie CLI-Pasring betrieben und dann die zentrale(n) Funktionen aufgerufen werden? So in der Art:

Code: Alles auswählen

def main():
    # parse command line params
    # call ``clean()`` with given (or default) arguments

if __name__ == "__main__":
    main()
- er werden Objekte an Namen gebunden, die man nicht noch einmal benötigt; das kann man dann oftmals kompakter und dennoch lesbar ausdrücken:

Code: Alles auswählen

curtime = time.time()
difftime = curtime - ftime
# wird zu:
difftime = time.time() - ftime
- Wieso wird ein Fehler suggeriert, wenn eine Datei jünger als eine Woche ist? :K

- Die Ausgaben würde ich auch eher optional ("-v") und ggf. auch mit dem ``logging``-Modul gestalten.

- Die Formatierung widerspricht an einigen Stellen PEP8:

Code: Alles auswählen

# falsch mit Leerzeichen zwischen Name und Parameterklammer
print ("hallo")
# richtig ohne Leerzeichen
print("hallo")

# falsch ohne Leerzeichen nach dem trennenden Komma
fullpath=os.path.join(root,file)
# richtig
fullpath=os.path.join(root, file)
- Was soll das ``exit`` am Schluss der inneren Schleife? Das bewirkt nichts, außer einen ``NameError`` auszulösen - meinst Du ``sys.exit``? Falls ja, muss man ein Callable auch *aufrufen* und nicht nur den Namen hinschreiben ;-) Wobei sich mir der Sinn verschließt, an dieser Stelle das Programm zu beenden!

- zu viele "Magic Numbers": Wieso ist der Pfad fix vorgegeben? Wieso die Zeitspanne? Das sollte man als Parameter an eine Funktion übergeben können und von außen sogar als Command Line Parameter. (Du kannst Modul global natürlich default-Werte hinterlegen - bei der Zeit mag das evtl. sinnvoll sein)

- last but not least: Bitte benutze für Python-Code auch die Python-Code-Tags! Das gilt zwar auch generell, aber speziell bei der Präsentation der eigenen Arbeit im Snippet- und Showcase-Forum erachte ich das als Selbstverständlichkeit :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:

Code: Alles auswählen

# falsch ohne Leerzeichen nach dem trennenden Komma
fullpath=os.path.join(root,file)
# richtig
fullpath=os.path.join(root, file)

Code: Alles auswählen

# falsch ohne Leerzeichen vor und nach dem Gleichheitszeichen
fullpath=os.path.join(root, file)
# richtig
fullpath = os.path.join(root, file)
:mrgreen:
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

`fullpath` würde ich zur Sicherheit übrigens auch nochmal der PEP8-Kommission vorlegen. Nicht, dass da am Ende doch besser `full_path` rauskommen sollte... ^^
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

/me hat geschrieben: :mrgreen:
Pedant! :oops:

Mist, hab ich den Wald vor lauter Bäumen doch nicht gesehen... :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
RSMVDL

So besser?

Code: Alles auswählen

import sys, os, time
path="/home"
for root, subFolders, files in os.walk(path):
    for file in files:
        fullpath=os.path.join(root, file)
        ftime = os.path.getmtime(fullpath)
        print (fullpath)
        print (ftime)
        curtime = time.time()
        difftime = curtime - ftime
        if difftime > 7257600: ##12 wochen in sek.
            os.remove(fullpath)
        else:
            print("Probleme bei der Ausfuerung")
            break
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

RSMVDL hat geschrieben:So besser?
Zu viele Importe. Zu viele temporäre Variablen. Magische Werte im Code. Keine Fehlerbehandlung. Code auf Modulebene.

Und immer noch keine Python-Tags um den Python-Code. :evil:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import print_function
from __future__ import unicode_literals

import os
import time

TIME_OFFSET_IN_SECONDS = 7257600  # <= 60s * 60m * 24h * 7d * 12w

def remove_files(path):
    for root, _, files in os.walk(path):
        for filename in files:
            full_path = os.path.join(root, filename)
            #print(fullpath)
            if time.time() - os.path.getmtime(full_path) > TIME_OFFSET_IN_SECONDS:
                try:
                    os.remove(full_path)
                except Exception as e:
                    print('Datei "{}" konnte nicht gelöscht werden. Fehlermeldung: {}'.format(
                        full_path, e))

def main():
    remove_files('/temp')
    
if __name__ == '__main__':
    main()
Die future-Importe verwende ich immer in Python 2. Die sind optional.

In main sollte man dann noch Argumente von der Kommandozeile entgegennehmen statt wie jetzt wild in einem fixen Verzeichnis zu löschen.
Antworten