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