Seite 1 von 1
Verzeichnis löschen, falls älter als...
Verfasst: Dienstag 6. Mai 2008, 20:38
von nemomuk
Hallo,
habt ihr eine Idee, wie ich ein Verzeichnis/eine Datei löschen könnte, falls diese älter als xx Tage/Stunden/Min/etc. ist?
Danke!
Verfasst: Dienstag 6. Mai 2008, 20:54
von Masaru
Hallo auch.
Du kannst den Zeitpunkt der letzten Modifikation einer Datei wie folgt ermitteln:
Code: Alles auswählen
import datetime
import os
last_modified = datetime.datetime.fromtimestamp(
os.path.getmtime(r'c:\PfadZumZiel'))
Ein DatetimeObjekt mit dem aktuellen Zeitpunkt bekommst du mit
datetime.datetime.now() und ein Timedelta von 2 Tagen z.B. hiermit
two_days = datetime.timedelta(days=2)
Dann kannst du das aktuelle DT-Objekt minus dem Timedelta von 2 Tagen nehmen und prüfen, ob das last_modified DT-Objekt der Datei vor diesem neuen DT-Objekt lag.
>>Masaru<<
Verfasst: Dienstag 6. Mai 2008, 22:22
von Mad-Marty
Masaru hat geschrieben:Hallo auch.
Du kannst den Zeitpunkt der letzten Modifikation einer Datei wie folgt ermitteln:
Code: Alles auswählen
import datetime
import os
last_modified = datetime.datetime.fromtimestamp(
os.path.getmtime(r'c:\PfadZumZiel'))
Ein DatetimeObjekt mit dem aktuellen Zeitpunkt bekommst du mit
datetime.datetime.now() und ein Timedelta von 2 Tagen z.B. hiermit
two_days = datetime.timedelta(days=2)
Dann kannst du das aktuelle DT-Objekt minus dem Timedelta von 2 Tagen nehmen und prüfen, ob das last_modified DT-Objekt der Datei vor diesem neuen DT-Objekt lag.
>>Masaru<<
zu umständlich finde ich ...
einfach prüfen ob m_time < time.time() - 2 * 24 * 60 * 60 ist.
Die modified time ist der 8te index eines os.stat() calls.
Code: Alles auswählen
if os.stat(r'C:\myfile')[8] < time.time() - 2 * 24 * 60 * 60:
# delete file
Verfasst: Dienstag 6. Mai 2008, 22:35
von Leonidas
Mad-Marty hat geschrieben:zu umständlich finde ich ...
Ich finde es besser, da man keine Indexerei braucht und auch nicht ausrechnen muss wie viele Sekunden ein Tag ist. Apropos, statt ``[8]`` kann man auch auf ``.st_mtime`` zugreifen.
Verfasst: Dienstag 6. Mai 2008, 22:46
von lunar
Mad-Marty hat geschrieben:Masaru hat geschrieben:Hallo auch.
Du kannst den Zeitpunkt der letzten Modifikation einer Datei wie folgt ermitteln:
Code: Alles auswählen
import datetime
import os
last_modified = datetime.datetime.fromtimestamp(
os.path.getmtime(r'c:\PfadZumZiel'))
Ein DatetimeObjekt mit dem aktuellen Zeitpunkt bekommst du mit
datetime.datetime.now() und ein Timedelta von 2 Tagen z.B. hiermit
two_days = datetime.timedelta(days=2)
Dann kannst du das aktuelle DT-Objekt minus dem Timedelta von 2 Tagen nehmen und prüfen, ob das last_modified DT-Objekt der Datei vor diesem neuen DT-Objekt lag.
>>Masaru<<
zu umständlich finde ich ...
einfach prüfen ob m_time < time.time() - 2 * 24 * 60 * 60 ist.
Die modified time ist der 8te index eines os.stat() calls.
Code: Alles auswählen
if os.stat(r'C:\myfile')[8] < time.time() - 2 * 24 * 60 * 60:
# delete file
Seit 2.5 kannst du den Index durch das Attribute ``st_mtime`` ersetzen. Auch könntest du gleich ``os.path.getmtime`` nehmen. Das würde die Lesbarkeit ein bisschen erhöhen. Allerdings ist die Berechung ziemlich schlecht lesbar, besonders für Leute wie mich, die so ihre Schwierigkeiten mit Kopfrechnen haben
Außerdem ist das Ganze untypisiert, da man mit Fließkommazahlen anstatt mit Datumswerten rechnet. Dadurch baut man leichter Rechenfehler ein, und wundert sich dann, warum auf einmal wichtige Daten verschwinden
Der ``datetime``-Code ist nur unwesentlich länger, dafür allerdings besser lesbar und flexibler.
Verfasst: Dienstag 6. Mai 2008, 23:13
von Masaru
Oha ... das wir mal einer Meinung sind lunar ^^.
Ich finde ...
Code: Alles auswählen
import os
from datetime import datetime, timedelta
start_directory = r'x:\Einstiegs\Verzeichnis'
limit_datetime = datetime.now() - timedelta(days=2)
removed = []
not_removed = []
# ganz pedantische sollten noch 'start_directory' pruefen
for root, dirs, files in os.walk(start_directory):
for fname in files:
fpath = os.path.join(root, fname)
last_modified = datetime.fromtimestamp(
os.path.getmtime(fpath))
if last_modified < limit_datetime:
try:
os.remove(fpath)
removed.append(fpath)
except OSError:
not_removed.append(fpath)
# die beiden Listen 'removed' und 'not_removed' koennte
# man nun ausgeben, in eine Logdatei schreiben lassen oder
# auch andersweitig verbraten ;)
... ist ein sauberes Stück Code, welches sich leicht erweitern lässt und auch für andere leserlich und verständlich ist.
>>Masaru<<
Verfasst: Mittwoch 7. Mai 2008, 07:25
von jens
Vielleicht hilft dabei auch:
http://www.jorendorff.com/articles/python/path/ Wenn es ein zusätzliches Modul sein darf
