Forum: PC Hard- und Software Gibt es sowas in Python mit XML?


von Gustl B. (-gb-)


Lesenswert?

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):
1
<temperatur>
2
  <2019>
3
    <januar>
4
      <messwerte messgerät="thermometer" ort="gartenhaus"/>
5
        <0 wert="5°C" zeit="8:32"/>
6
        <1 wert="4°C" zeit="13:56"/>
7
        <2 wert="10°C" zeit="16:08"/>
8
        <3 wert="7°C" zeit="22:42"/>
9
      </messwerte>
10
    </januar>
11
    <februar>
12
      .
13
      .
14
      .
15
    </februar>
16
  </2019>
17
  <2018>
18
    .
19
    .
20
    .
21
  </2018>
22
</temperatur>

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!

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

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.

: Bearbeitet durch User
von Gustl B. (-gb-)


Lesenswert?

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.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Als XML Format ist das schon mal Unsinn, du vermischt Tags und Daten.

von Udo S. (urschmitt)


Lesenswert?

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.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Eine kleine Datenbank findest du in MySQL. Oder MariaDB ist glaub ich 
der freie Nachfolger.

von Udo S. (urschmitt)


Lesenswert?

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.

von Gustl B. (-gb-)


Lesenswert?

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.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Sowas kann man mit einer ganz Primitiven Tabelle in jeder beliebigen 
Datenbank ablegen.
1
+---------------------+-----------------+----------+
2
| datum               | sensor          | messwert |
3
+---------------------+-----------------+----------+
4
| 2019-11-11 11-11-11 | sensor-fenster1 |     23.4 |
5
| 2019-11-11 11-11-11 | sensor-fenster2 |     22.8 |
6
| 2019-11-11 11-12-11 | sensor-fenster1 |     23.5 |
7
| 2019-11-11 11-12-11 | sensor-fenster2 |     22.8 |
8
usw...
Für Fortgeschrittene könnte man das noch mit einer sensor_id und zwei 
Tabellen machen...

von Gustl B. (-gb-)


Lesenswert?

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.

von Bernd K. (prof7bit)


Lesenswert?

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

: Bearbeitet durch User
von Bernd K. (prof7bit)


Lesenswert?

Oder so:

Tabelle 1: Messstellen

ID  Name
--------------
1   Gartenhaus
2   Dachboden
3   Regentonne


Tabelle 2: Messgrössen

ID  Name        Einheit
-----------------------
1   Temperatur  °C
2   Druck       mBar



Tabelle 3: Messwerte

Zeitstempel  Messtelle  Messgröße Messwert
------------------------------------------
2019-02-04   1          1         23
2019-02-04   2          1         42
2019-02-04   1          2         1003
2019-02-04   2          2         1001
2019-02-05   1          1         24
2019-02-05   2          1         43
2019-02-05   1          2         1004
2019-02-05   2          2         1002
2019-02-05   3          1         18

von Gustl B. (-gb-)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

@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

von JJ (Gast)


Lesenswert?

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.

von Gustl B. (-gb-)


Lesenswert?

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.

von Jemand (Gast)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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.

von Ingo D. (ingo2011)


Lesenswert?

Hi ,

schaue Dir mal die InfluxDb an die ist für sowas gemacht.
Da gibt es dann auch für Python entsprechende Module.

https://influxdb-python.readthedocs.io/en/latest/examples.html


Gruß Ingo

von Rolf M. (rmagnus)


Lesenswert?

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.html
https://www.sqlitetutorial.net/sqlite-python/

: Bearbeitet durch User
von Sven B. (scummos)


Lesenswert?

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

von Gustl B. (-gb-)


Lesenswert?

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.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Nimm CSV, slles kann das lesen und es spart immens Platz.
Auswerten mußt du das ja eh ;)

Oder SQLite.

: Bearbeitet durch User
von JJ (Gast)


Lesenswert?

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

von Gustl B. (-gb-)


Lesenswert?

Ja, CSV wäre was.
Direkt mit Objekten arbeiten hat auch was, danke!

: Bearbeitet durch User
von JJ (Gast)


Lesenswert?

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.

von Sven B. (scummos)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.