csv.writer messdaten scheiben und gleichzeitig lesen

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
Searcher78
User
Beiträge: 2
Registriert: Samstag 17. November 2012, 04:09

Hallo zusammen,

ich stehe hier grade vor einem Problem und zwar diesem:

Ich erstelle ein writer-Objekt von csv.writer und übergebe ihm eine geöffnete Datei (wb). In die schreibt mein Programm auch schön die aufgenommenen Messwerte. Jetzt mein Problem, ich bin zu blöde, die Datei nach dem Schreiben der Werte (alle 10 Sekunden) wieder zu schließen um dann mit einem php-Skript das Ganze grafisch auszugeben, da die Datei ja gesperrt ist. Ich bin recht neu bei Python, kann sein, dass die Lösung total simpel ist und ich einfach ein Brett vor dem Kopf habe.

LG
Carsten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Searcher78
Wenn ich Dich richtig verstehe, möchtest Du die Messwerte quasi "streamen". Halte ich für eine nicht so gute Idee.
Wäre es nicht sinnvoller, die Daten an das php-Skript zu übergeben. Schau' Dir mal diesen Beitrag auf stackoverflow an, dort wird eine Lösung mit dem urllib- und dem urllib2-Modul beschrieben.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Searcher78
User
Beiträge: 2
Registriert: Samstag 17. November 2012, 04:09

Danke für deine Antwort.

Ziel ist es halt eine Datei zu bekommen, in welcher (erstmal) nur die Umgebungstemperatur und die Temperatur in einem bestimmten Raum gespeichert wird. Diese soll sich gut weiterverarbeiten lassen, also dachte ich an eine CSV. Jetzt hab ich im Netz eine Möglichkeit gesehen, in welcher jemand eine CSV ausließt um die Daten per PHP (hab inzwischen auch eine schöne Variante mit javascript gefunden) als Graph anzuzeigen. Der Graph läßt sich dann z.b. als Monats-, Wochen-, Tagesansicht aufrufen, oder man gibt eine bestimmte Zeitspanne ein um sich diese anzeigen zu lassen. Daher wäre es halt schön, die von meinem Programm generierte CSV, welche ja alle Messwerte seit "Anbeginn der Zeit" enthält einfach lesend zu öffnen und die Daten dann zu verarbeiten. Mit deiner Möglichkeit könnte ich, wenn ich alles richtig verstanden habe, ja die CSV (nach einem Neustart) einlesen und dann wie in deinem Link beschrieben PHP zur Verfügung stellen und parallel neue Werte in die CSV schreiben und an meine "PHP-Übergabe-Liste" anhängen? Stellt sich mir jetzt die Frage, ob die Liste bei 10 Sekunden Auflösung nicht irgendwann einfach zu groß würde? (~ 3,1 Millionen Messwerte im Jahr)

Welche mögliche Lösung mir noch gekommen ist, wobei mir heute und morgen die Zeit zum Testen fehlt... wäre es nicht möglich die CSV-Datei selbst zu erzeugen, ohne den csv.writer? Und die Datei nach jedem Schreiben zu schließen? (wobei ich dann natürlich ein Problem habe, wenn genau zum Zeitpunkt des Schreibens, der Graph die Datei lesen möchte... ach verdammt)

LG
Carsten

P.S.: Hier mal der Aufbau der CSV, falls das weiterhilft:

Jahr, Monat, Tag, Stunde, Minute, Sekunde, Sensor 1, Sensor 2

Ich frag mich ob ich das vielleicht ganz anders angehen sollte, hab leider von Graphen unter PHP nicht viel Ahnung und hangel mich da an einem Beispielprogramm entlang, hab das hier gefunden, das kann mit CSV Dateien umgehen http://www.highcharts.com/ und sieht auch noch sehr schick aus...
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Ich werfe mal eine round robin database als Speicherformat in den Raum. Schau dir mal RRDtool[1] an.
Neben dem Speichern kann es auch das Erzeugen der Graphen übernehmen.

Es gibt sowohl Python als auch PHP bindings dafür.

[1] http://oss.oetiker.ch/rrdtool/
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Carsten,

hört sich an, als ob Du mit einer Datenbank besser bedient wärst.

Ich kann gerade Dein Problem nicht nachvollziehen, da ich automatisch shared access
zum Lesen und Schreiben habe.
Willst Du jedes mal die gesamten Daten neu schreiben?
Zum Anhängen ohne csv_writer:

Code: Alles auswählen

datei=open('temperatur.csv','a',0)
datei.write(','.join(map(str,(Jahr, Monat, Tag, Stunde, Minute, Sekunde, Sensor1, Sensor2)))+'\n')
datei.close()
wobei ich die Datei nicht wieder schließen muß, um sie einlesen zu können.

Grüße
Sirius
BlackJack

@Searcher78: Das Dateizugriffsproblem klingt irgendwie nach Windows, oder? Unter Unix-Betriebssystemen, also zum Beispiel Linux und MacOS sollte es kein Problem sein die Datei von beiden Prozessen zu öffnen.

Bei der zu erwartenden Datenmenge und auch um Nebenläufigkeitsprobleme mit dem Auslesen von nicht vollständig geschriebenen Datensätzen zu vermeiden, würde ich auch eine Datenbank ins Auge fassen.

SQLite zum Beispiel. Da kommt man mit Python und PHP, und einer Menge anderer Programmiersprachen, dran, hat auch nur eine Datei, kann aber zum Beispiel gezielt Daten für bestimmte Zeiträume und Sensoren abrufen ohne durch die gesamte Datei lesen zu müssen.

Als Tabellenstruktur würde man dort nicht für jeden Sensor eine Spalte haben, sondern eine Spalte für den Wert und eine die den Sensor identifiziert. Die Zeitinformationen würde ich auch in der CSV-Datei übrigens in eine Spalte schreiben, und in einer SQL-Datenbank erst recht, weil es dafür Datentypen gibt. Eine Tabelle dafür könnte so aussehen:

Code: Alles auswählen

CREATE TABLE sensor_value (
  id INTEGER PRIMARY KEY,
  timestamp DATETIME,
  sensor_id INTEGER,
  value REAL
)
Die `sensor_id` kann man auch nutzen um in einer weiteren Tabelle Metadaten zum Sensor zu speichern. Wie Art, Bezeichnung, wo er sich befindet und so weiter.
Antworten