Dateihandling

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
Apex
User
Beiträge: 8
Registriert: Montag 10. April 2017, 12:50

Hallo, ich möchte vorab sagen dass ich kein fertiges Script möchte. Ich zerbreche mir zur Zeit den Kopf wie ich ein sinnvolles Dateihandling machen kann und dachte ihr könnt mir einen Denkanstoss geben.

Folgende Situation:
Ich sammel mit einem RPi und Sensoren verschiedene Daten und schreibe sie in eine Datei. Hier ein Ausschnitt in dem einfach nur GPS Korrdinaten und Uhrzeiten in eine *.wkt geschrieben werden.

Code: Alles auswählen

    
file = "Umweltdaten" + time.strftime("%Y%m%d_%HUhr") + ".wkt"
geoFile = open(file, 'a')
geoFile.write(time.strftime("%d.%m.%Y %H:%M:%S ") + "POINT(" + str(latitude / 1000000.0) + " " + str(longitude / 1000000.0) + ")\n")
geoFile.close()


Wie ihr im Script (1.Zeile) sehen könnt wird automatisch eine neue Datei angelegt wenn die volle Stunde wechselt. Das ist auch so gewünscht da ich die Datei via FTP (als Datensicherung) an einen anderen Server senden möchte.

Die Frage die ich mir stelle, wie kann ich am besten die Datei / die Dateien (*.wkt) auswählen die nicht mehr beschrieben wird (sprich alle die älter als die "aktuelle" Stunde sind) .
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Apex: Zum Beispiel mit dem `glob`-Modul die Dateipfade ermitteln und die Liste mit `sort()` sortieren und dann alle bis auf den letzten Eintrag nehmen.

Zeichenketten und Werte mit ``+`` zusammenstückeln ist unübersichtlich und eher BASIC als Python. In Python gibt es dafür die `format()`-Methode auf Zeichenketten. Und wenn man `datetime.datetime.now()` verwendet, dann kann man das Ergebnis auch mit entsprechenden Format-Codes formatieren, statt eine extra Methode oder Funktion aufrufen zu müssen.

Den aktiullen Zeitpunkt solltest Du auch nur *einmal* ermitteln, denn zwischen dem Erstellen des Dateinamens und dem Schreiben in die Datei vergeht ja auch ein klein wenig Zeit und wenn Du Pech hast endest Du am Ende mit einem Eintrag für die nächste Stunde in der Datei.

`file` ist zum einen der Name des eingebauten Dateidatentyps, und zum anderen ein schlechter Name für einen Datei*namen*.

`geoFile` sollte per Namenskonvention `geo_file` heissen.

Schau Dir mal die ``with``-Anweisung an.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Als erstes solltest Du die aktuelle Uhrzeit nur einmal bestimmen, sonst kann es passieren, dass Daten für einen Zeitpunkt in der falschen Datei landen. Dann nicht Strings mit + und str zusammenstückeln, dafür gibt es .format. Dateien öffnet man mit dem with-Statement:

Code: Alles auswählen

now = datetime.datetime.now()
filename = "Umweltdaten{:%Y%m%d_%HUhr}.wkr".format(now)
with open(filename, 'a') as geofile:
    geofile.write("{:%d.%m.%Y %H:%M:%S} POINT({} {})\n".format(
        now, latitude / 1000000.0, longitude / 1000000.0))
Zum Problem: Du erzeugst einfach den Dateinamen für die aktuelle Uhrzeit und nimmst alle Dateien, die früher sind.
Antworten