Verzeichnis löschen, falls älter als...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

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<<
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

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<<
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Vielleicht hilft dabei auch: http://www.jorendorff.com/articles/python/path/ Wenn es ein zusätzliches Modul sein darf ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten