PyYaml Problem beim Laden

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
locutus
User
Beiträge: 19
Registriert: Mittwoch 21. Oktober 2015, 08:39

Moin Moin,

vermutlich ist es schnell geklärt, aber ich bin ein Neuling was Yaml angeht ;-)

Also: Ich habe eine Datei im Yaml-Format mit Logging-Daten, wo jedes Sample mit einem eigenen Header beginnt, wo Zeitstempel etc. untergebracht sind:

Code: Alles auswählen

header: 
  seq: 153813
  stamp: 
    secs: 1441716503
    nsecs: 590274915
  frame_id: 
...
da viele samples in der Datei abgelegt sind, kommt auch dieser Header dementsprechend angepasst oft vor. Wenn ich jetzt die Datei in Python mit dem yaml Modul lade:

Code: Alles auswählen

file_obj = open(filename, "r")                        
loaded = yaml.load(file_obj, Loader=yaml.CLoader)     
file_obj.close()
ist loaded allerdings nur das letzte sample, ich bräuchte allerdings alle. Danach auf die einzelnen keys zugreifen etc. ist kein Problem, aber warum kommt nur das letzte Sample? Überschreibt er beim Laden alles bisherige, wenn ein key erneut auftaucht? (In diesem Fall ja 'header')

Vielen Dank schon einmal!
Sirius3
User
Beiträge: 17759
Registriert: Sonntag 21. Oktober 2012, 17:20

@locutus: wenn das wirklich so in der Datei steht, ist die oberste Ebene ein Wörterbuch und darin kann jeder Schlüssel nur einmal vorkommen. Die Antwort auf die letzte Frage ist also: ja. Wer erzeugt diese Datei? Kann man dem Erzeuger beibringen eine Liste anzulegen?
locutus
User
Beiträge: 19
Registriert: Mittwoch 21. Oktober 2015, 08:39

@Sirius3:
Danke für die Antwort!
Habe die Datei so bekommen, gut, dass mein Verdacht richtig war.
Jetzt weiß ich, in welche Richtung ich weiter probieren kann ;-)
BlackJack

@locutus: Wobei YAML ja durchaus mehrere YAML-Dokumente in einer Datei speichern kann. Wenn die syntaktisch nicht getrennt sind, hat der Erzeuger der Datei an dieser Stelle Mist gebaut würde ich sagen:

Code: Alles auswählen

In [19]: !cat test.yaml
header:
  seq: 153813
  stamp:
    secs: 1441716503
    nsecs: 590274915
  frame_id:
---
header:
  seq: 4711
  stamp:
    secs: 42
    nsecs: 23
  frame_id:
...

In [20]: f = open('test.yaml')

In [21]: for sample in yaml.load_all(f):
   ....:     print sample
   ....: 
{'header': {'stamp': {'secs': 1441716503, 'nsecs': 590274915}, 'frame_id': None, 'seq': 153813}}
{'header': {'stamp': {'secs': 42, 'nsecs': 23}, 'frame_id': None, 'seq': 4711}}
locutus
User
Beiträge: 19
Registriert: Mittwoch 21. Oktober 2015, 08:39

@BlackJack:

vielen Dank, ja, auf die Sache mit dem "---" war ich auch schon gestoßen, dachte aber, wenn ich die Daten so bekomme, müssen die schon richtig sein ;-) Ich arbeite jetzt so weiter, als ob es so wäre und warte auf die nächsten Daten^^
locutus
User
Beiträge: 19
Registriert: Mittwoch 21. Oktober 2015, 08:39

Da meine nächste Frage sehr ähnlich zur ursprünglichen war, versuche ich es mal weiter in diesem Thread, in der Hoffnung, dass er nicht übersehen wird ;-)

Wenn man mehrere Yaml-Dokumente in einer Datei hat, getrennt durch "---", kann man dann yaml.load verwenden, um gezielt ein bestimmtes Dokument aus der Datei zu laden, z.B. das zweite? Oder läd yam.load bei jedem neuen Aufruf das nächste Dokument ein, sodass man darüber eines gezielt erreichen könnte? Ich würde ungern yaml.load_all verwenden, um dann dasjenige auszuwählen, das wäre bei der Datei ein ziemlicher Overhead.

Vielen Dank schon einmal!
BlackJack

@locutus: `yaml.load()` kommt nur mit einem Dokument in der Datei zurecht und löst andernfalls eine Ausnahme aus. `load_all()` lädt ja nicht alles auf einmal, sondern gibt einen Iterator über die Dokumente zurück, der die Dokumente „lazy“ lädt.
locutus
User
Beiträge: 19
Registriert: Mittwoch 21. Oktober 2015, 08:39

@BlackJack: Ah, ok, danke. Wenn man jetzt das z.B. erste von den Dokumenten nur haben möchte, kann man das irgendwie netter machen, als eine for-Schleife dann abzubrechen?
BlackJack

@locutus: Mit der `next()`-Funktion.
locutus
User
Beiträge: 19
Registriert: Mittwoch 21. Oktober 2015, 08:39

@ BlackJack: Ah, ok, vielen Dank!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

locutus hat geschrieben:Da meine nächste Frage sehr ähnlich zur ursprünglichen war, versuche ich es mal weiter in diesem Thread, in der Hoffnung, dass er nicht übersehen wird ;-)
Bitte erstell einen neuen Thread. Wenn du nicht an dasselbe Thema anknuepfen willst, dann ist deine Frage besser nicht hier aufgehoben. Posts hier koennen Benachrichtigungen an die vorherigen Poster ausloesen und wenn es ihnen nicht helfen kann, sollte man das vermeiden ;)

Edit: Ok, ich sehe gerade dass es dein Thread war. Trotzdem gilt, dass ein neuer Thread Leuten mit demselben Problem besser helfen kann, weil er einfacher gefunden wird :)
Antworten