Hallo,
ich möchte Daten verwalten. Ich habe also Daten, möchte diese geordnet
ablegen, z. B. als XML und dann mit einem Programm lesen und an
Funktionen weiterreichen die ihr jeweiliges Ergebnis wieder in die
Datenstruktur hineinschreiben.
Im XML stelle ich mir das grob so vor (Beispiel):
Das möchte ich also einlesen um dann möglichst einfach auf die einzelnen
Werte oder Zeiten zugreifen zu können. Ich stelle mir das so vor, dass
ich mir die anzahl der jeweiligen kinder anzeigen lassen kann, also
len(temperatur) würde 2 liefern weil es ja 2018 und 2019 gibt.
len(temperatur.2019.januar.messwerte) würde 4 zurückliefern. Einen Wert
selbst würde ich gerne als temperatur.2019.januar.messwerte.1:wert
adressieren. Und genau so einfach würde ich gerne neue Einträge
einfügen. Also z. B.
insert(temperatur.2019.januar.mittelwert:wert="6.5°C").
Adressieren will ich, damit ich einzelne Werte oder sonstige Inhalte an
Funktionen weiterreichen kann. Die Funktion mittelwert bekäme dann
einfach temperatur.2019.januar.messwerte und kann dan selber gucken wie
viele Werte darin enthalten sind.
Gibt es sowas? Ich habe mir jetzt schon etwas xml.etree.ElementTree
angeguckt, aber das macht sehr viel mit Suche und Funktionen und ich
habe kein Beispiel gefunden, dass mir zeit wie ich einfach einen Zweig
in einem verästeltem Baum adressiere. Mein Problem ist eben, dass ich
vorher nicht weiß wie die Äste genau aussehen und auch nachträglich noch
was verändern können will und dass nicht alle Äste gleich sind. Manche
Äste sind Temperaturen, manche andere Dinge, ich kann also schlecht eine
Klasse anlegen die alles erschlägt.
Vielen Dank!
Ich halte das für eine suboptimale (gelinde gesagt) Strukturierung der
Daten. Ich würde einfach eine Tabelle machen, erste Spalte Zeitstempel,
zweite Spalte Temperatur. Fertig.
Und wenn Du tabellarische Daten speichern willst nimmst Du eine
relationale Datenbank. Dafür wurde das erfunden, alles andere ist Käse
und machts nur komplizierter und unhandlicher.
Gut möglich, aber das werden dann viele Tabellen. Und wie adressiere ich
das in einer Datenbank? Ich habe hier in Access/Base geguckt, ja da kann
man das machen, aber ich weiß nicht wie ich die Daten dann rausreiche an
eigene Programme.
XML als Format zur Verwaltung von Daten (also regelmäßiges lesen /
Ändern Einfügen Löschen) ist völlig ungeeignet.
Wenn ich lese was du damit machen willst würde ich entweder eine
relationale Datenbank oder eine NoSQL DB nehmen
https://de.wikipedia.org/wiki/NoSQL
XML benutzt man um Daten strukturiert weiterzugeben, wobei man evt. auch
das etwas sparsamere Json nehmen kann.
Wenn du unbedingt XML mit Phyton lesen und schreiben willst eine Suche
nach "Phyton XML" gab bei mir kurz mal 116000 Treffer, da sollte sich
also was finden lassen.
Gustl B. schrieb:> Mein Problem ist eben, dass ich> vorher nicht weiß wie die Äste genau aussehen und auch nachträglich noch> was verändern können will und dass nicht alle Äste gleich sind. Manche> Äste sind Temperaturen, manche andere Dinge, ich kann also schlecht eine> Klasse anlegen die alles erschlägt.
Das sieht für mich nach ziemlich viel Konfusion aus.
Werde dir klar was du für Daten hast und wie du diese Daten organisieren
willst.
Udo S. schrieb:> Werde dir klar was du für Daten hast und wie du diese Daten organisieren> willst.
Das geht leider nicht. So wie im Beispiel mit den Temperaturen können
manchmal ganz neue Dinge interessant werden. Z. B. Höhe über NN,
Windstärke, oder nach ein paar Jahren kommt noch ein neues Messgerät
dazu und dann will ich auch das unterscheiden können. Bei XML würde ich
das einfach mit dazuschreiben als Eintrag.
Eigentlich suche ich etwas wie ein Objekt dem ich Kinder und
Eigenschaften hinzufügen kann und zwar beliebig.
Das will ich dann möglichst einfach adressieren können und auch in eine
Datei schreiben und daraus lesen. Das muss nicht schnell sein oder so.
Natürlich, aber jetzt soll noch der Mittelwert für den Januar 2019
gespeichert werden.
Und dann habe ich vielleicht einmal an einem Tag ganz viele Messwerte
gemacht und in eine Datei geschrieben und möchte jetzt zu dem Messtag
noch den Pfad zur Datei dazuschreiben.
Das ist leider kein unbewegliches Zeil sondern es kann sich dauernd
verändern. Es ist deutlich kompexer wie nur Temperaturmessungen an einem
Tag.
Die Information kann schon wie ein Baum betrachtet werden, aber dem
können neue Äste wachsen und andere neue Eigenschaften bekommen.
Ich suche also eine Datenablage in Baumstruktur die ich aber auch noch
gut adressieren kann. Durchsuchen wäre auch gut.
Meine Notlösung ist ein Dateisystem. Also jedes Blatt am Baum wird eine
Datei. So wie eine Registry oder /etc.
Gustl B. schrieb:> Eigentlich suche ich etwas wie ein Objekt dem ich Kinder und> Eigenschaften hinzufügen kann und zwar beliebig.
Du suchst also eine hierarchische Datenbank. Die sind aber wohl etwas
aus der Mode gekommen. Die einfachste Form davon die überall geht ist
das Dateisystem selbst mit Ordnern und Unterordnern. Aber ich halte das
nicht für sinnvoll oder zielführend!
---
Ich bin der Meinung daß das Speichern der Temperaturmessungen in einer
relationalen Datenbank besser aufgehoben wäre:
Tabelle 1: Messtellen
ID Name
--------------
1 Gartenhaus
2 Dachboden
3 Regentonne
Tabelle 2: Temperatur
Zeitstempel Messtelle Temperatur
---------------------------------
2019-02-04 1 23
2019-02-04 2 42
2019-02-05 1 24
2019-02-05 2 43
2019-02-05 3 18
Tabelle 3: Luftdruck
Zeitstempel Messtelle Druck
------------------------------
2019-02-04 1 1003
2019-02-04 2 1001
2019-02-05 1 1004
2019-02-05 2 1002
Kann ich da nachträglich noch was hinzufügen wie "Windgeschwindigkeit"?
Und wie kann ich das adressieren und an eigene Programme weitergeben?
Ist ja schön wenn das alles in Access lebt, aber ich will ja mit den
Werten rechnen und die Ergebnisse wieder in die Datenbank schreiben.
@Gustl,
wenn's unbedingt XML sein muss dann mach das halt.
<temperatur>
<jahr value="2019">
<monat value="januar">
<sensor type="thermometer" ort="gartenhaus">
<data id="0" wert="5" zeit="8:32"/>
<data id="1" wert="4" zeit="13:56"/>
</sensor>
</monat>
</jahr>
</temperatur>
Der Zugriff ist mit den verfügbaren Lib's kein Problem, aber wie schon
gesagt für diese Art von Daten suboptimal. Wenn du jetzt Werte von
verschiedenen Sensoren für einen bestimmten Zeitraum haben willst liegen
die Daten völlig verstreut herum.
Wenn schon dann lieber die Daten zeitlich fortlaufend ablegen den Sensor
mit abspeichern.
Sascha
Die Lösung von 14.11.2019 17:04 halte ich hier für optimal.
Wenn du mit den Daten rechnen willst kannst du das entweder im Programm
tun und eine weitere Tabelle befüllen, oder die kannst einen View auf
die Datenbank legen, die die Rechnung selbst schon enthält.
Sascha W. schrieb:> Der Zugriff ist mit den verfügbaren Lib's kein Problem, aber wie schon> gesagt für diese Art von Daten suboptimal.
Dazu habe ich bisher kein einfaches Beispiel gefunden.
Wie würdest du denn auf den oberen^^ (den um 8:32) zugreifen. Die
Uhrzeit ist natürlich noch nicht bekannt, sondern es soll der erste
Messwert vom Thermometer im Gartenhaus aus dem Januar 2019 gelesen
werden.
Dadurch, dass das jetzt alles Attribute sind muss man das quasi über
eine Suche lösen.
Wäre das statt:
<temperatur>
<jahr value="2019">
<monat value="januar">
<sensor type="thermometer" ort="gartenhaus">
<data id="0" wert="5" zeit="8:32"/>
<data id="1" wert="4" zeit="13:56"/>
so:
<temperatur>
<2019>
<januar>
<thermometer>
<gartenhaus>
<0 wert="5" zeit="8:32"/>
<1 wert="4" zeit="13:56"/>
Könnte ich mir das so vorstellen:
temperatur.2019.januar.thermometer.gartenhaus.0:wert
Aber weil das eben leider nicht so ist im XML muss man wohl eine Abfrage
basteln, also hole das Attribut "wert" vom Jahr 2019, Monat Januar, Typ
Thermometer, Ort Gartenhaus id 0.
Finde ich umständlich. Ein Dateisystem erscheint mir immer besser zu
passen.
Gustl B. schrieb:> Aber weil das eben leider nicht so ist im XML muss man wohl eine Abfrage> basteln, also hole das Attribut "wert" vom Jahr 2019, Monat Januar, Typ> Thermometer, Ort Gartenhaus id 0.> Finde ich umständlich. Ein Dateisystem erscheint mir immer besser zu> passen.
Eine Datenbank macht das so ungefähr in jedem Punkt performanter,
sicherer und leichter. Fast so, als wären sie dafür gemacht worden.
Jemand schrieb:> Gustl B. schrieb:>> Aber weil das eben leider nicht so ist im XML muss man wohl eine Abfrage>> basteln, also hole das Attribut "wert" vom Jahr 2019, Monat Januar, Typ>> Thermometer, Ort Gartenhaus id 0.>> Finde ich umständlich. Ein Dateisystem erscheint mir immer besser zu>> passen.>> Eine Datenbank macht das so ungefähr in jedem Punkt performanter,> sicherer und leichter. Fast so, als wären sie dafür gemacht worden.
Und liefert auch gerne min/max/average für eine gegebene Selektion.
Gustl B. schrieb:> Kann ich da nachträglich noch was hinzufügen wie "Windgeschwindigkeit"?
Klar, warum auch nicht?
> Und wie kann ich das adressieren und an eigene Programme weitergeben?
Das"gibt" man nicht "weiter", sondern öffnet die Datenbank einfach im
Programm und greift direkt von dort darauf zu.
> Ist ja schön wenn das alles in Access lebt, aber ich will ja mit den> Werten rechnen und die Ergebnisse wieder in die Datenbank schreiben.
Ja, dann tu das doch. Wer hält dich davon ab?
Random .. schrieb:> Eine kleine Datenbank findest du in MySQL. Oder MariaDB ist glaub ich> der freie Nachfolger.
Ich würde sqlite empfehlen. Dann muss man nicht noch extra nen
Datenbankserver installieren.
https://docs.python.org/3/library/sqlite3.htmlhttps://www.sqlitetutorial.net/sqlite-python/
XML ist dafür Quatsch. sqlite ist eine gute Lösung für dein Problem.
Kann man auch mit sowas wie sqlitebrowser o.ä. bequem anschauen.
Den Mittelwert für den Januar speichert man natürlich nicht nochmal
extra -- den kann man in ein paar µs berechnen, wenn man ihn braucht.
Wurde schon gesagt, aber stimmt auch ;)
Sven B. schrieb:> Den Mittelwert für den Januar speichert man natürlich nicht nochmal> extra -- den kann man in ein paar µs berechnen, wenn man ihn braucht.
Mittelwert war nur ein Beispiel. Hier geht es um Auswertung von
Messungen, da gehen ziemlich viele Werte mit ein von Probengeometrie
über Gewicht und Zeitpunt, Messdauert, ... und auch ganze Dateien sind
dafür wichtig weil das keine einzelnen Messwerte sind sondern Reihen
vieler Messwerte. Ich dachte daher auch an Einträge in der
Tabelle/Datenbank die den Dateipfad enthalten für Messung, Kalibrierung
und Verleichsmessung mit einer Referenz.
Das werde ich ganz sicher nicht alles in Access rechnen lassen. Die
ganzen kleinen Programme sind schon fertig und lesen derzeit die jeweils
benötigten Werte aus vielen kleinen verstreuten Textdateien. Das ist
Altbestand, funktioniert, aber stammt aus einer Zeit in der man jedes
Byte zweimal umgedreht hat. Da sind in den Textdateien alle Werte direkt
hintereinander geschrieben mit einem Leerzeichen dazwischen und eben oft
stark begrenzt in der Anzahl der Zeichen. Dateinamen und Variablennamen
sind auch alle <3 Zeichen und daher eher schlecht zu verstehen und zu
debuggen.
Ich möchte das gerne nehmen, von Pascal auf eine modernere Sprache
umziehen und auch gleich alle Daten an einem Ort haben. Also eine
Tabelle/Datenbank/... mit allen Informationen (wann, wo, welche Datei,
...) und dann eben noch die vielen Dateien der einzelnen Messungen und
Kalibrierdaten.
Aber das ist eben sehr verzweigt. Nur wenige Messungen sind gleich, da
ändern sich oft Kalibrationsdaten oder andere Dinge, manche Messungen
werden oft wiederholt zur Kontrolle, manche Ergebnisse stammen aus
einer, manche aus mehreren Messungen. Daher wäre mir eben so eine Art
Objekt lieb das ich um Unterobjekte beliebiger Datentypen erweitern
kann. Wie die Windows Registry. Das ist auch ein Baum und es können
verschiedene Datentypen darin abgelegt werden.
Für mich sah XML sehr baumartig aus. Wichtig ist mir aber eben auch,
dass ich die Informationen einfach adressieren kann. Sehr gut wäre wenn
das wie bei einem Array funktioniert. Das mit Arrays ist halt doof weil
ich vorher nicht weiß wie groß das wird. Verkettete Listen wären was,
aber eigentlich will ich das nicht selber schreiben.
Also zum einen ist relationale Datenbank nicht gleich Acess. Du kannst
eine DB nutzen um die Daten nur zu speichern; du kannst die DB nutzen um
einen Teil deiner Berechnungen zu erledigen zu lassen. Das ist ganz dir
überlassen.
Eine DB als Speicherbackend zu haben bietet dir halt viele Vorteile wenn
es um Reports mittels SQL geht.
Wenn du ausschließlich in Python unterwegs sein willst, kannst du deine
selbst definierten Objekte auch einfach serialisieren und zur Platte
schreiben. Das entsprechende Modul heißt pickle
https://docs.python.org/3/library/pickle.html
Es gibt auch noch spezielle Datenbanken für Messreihen. Inwiefern die
dir helfen kann ich allerdings nicht bewerten.
Das bekannsteste Beispiel dürfte https://en.wikipedia.org/wiki/InfluxDB
sein.
Es hindert dich ja auch nichts daran, mehrere sqlite-Datenbanken zu
erstellen, wenn du mehrere stark unterschiedliche Dinge hast die du
nochmal sortieren willst. So eine Datenbank ist bei sqlite nur eine
Datei, die du frei benennen und verschieben kannst. Nur halt besser
strukturierbar als CSV und weniger unhandlich als XML.
Für deine Daten ist ein Textformat m.E. ungeeignet, weil es einfach
nicht schnell lesbar ist. Das parsen von Floats macht schon bei geringen
Datenmengen leicht den allergrößten Teil der Verarbeitungszeit aus.
Deshalb lieber ein Binärformat benutzen.
Metadaten würde ich persönlich vermutlich als JSON irgendwo
danebenlegen, oder einfach in einer sqlite-Tabelle speichern (entweder
als key->value, oder einfach key->JSON-Blob).
Meines Erachtens ist XML insgesamt ein ziemliches Spezialkonstrukt. Es
hat seine Anwendungen, aber man muss schon einen klar umrissenen Grund
haben, warum man nicht stattdessen z.B. JSON benutzt. XML hat seine
Stärken zum Beispiel bei Formaten, die über Jahre von vielen Leuten
bearbeitet und erweitert werden. Da gibt es dann relativ viel
Infrastruktur und Tooling, um z.B. über DTDs festzulegen, welche Form
Einträge genau haben müssen, welche vorhanden sein müssen und welche
optional sind, wie die Elemente geschachtelt werden etc. Das brauchst du
aber alles nicht.