Eine YAML-Datei in Python analysieren und auf die Daten zugreifen?

82

Ich bin neu in YAML und habe nach Möglichkeiten gesucht, eine YAML-Datei zu analysieren und die Daten aus der analysierten YAML zu verwenden / darauf zuzugreifen.

Ich habe Erklärungen zum Parsen der YAML-Datei gefunden, zum Beispiel das PyYAML- Tutorial " Wie kann ich eine YAML-Datei in Python analysieren ", " Python-Dikt in Objekt konvertieren? ", Aber was ich nicht gefunden habe, ist a einfaches Beispiel für den Zugriff auf die Daten aus der analysierten YAML-Datei.

Angenommen, ich habe eine YAML-Datei wie:

 treeroot:
     branch1: branch1 text
     branch2: branch2 text

Wie greife ich auf den Text "branch1 text" zu?

" YAML-Analyse und Python? " Bietet eine Lösung, aber ich hatte Probleme beim Zugriff auf die Daten aus einer komplexeren YAML-Datei. Und ich frage mich , ob es für den Zugriff auf die Daten von einer analysierten YAML - Datei, die möglicherweise etwas Ähnliches wie „einige Standardmethode ist Baum Iteration “ oder „ elementpath “ Notation oder etwas , das verwendet werden würde , wenn eine XML - Datei Parsen?

9 Monate
quelle
Mögliches Duplikat von Wie kann ich eine YAML-Datei in Python
analysieren

Antworten:

150

Da die yaml.load()Funktion von PyYAML YAML-Dokumente in native Python-Datenstrukturen analysiert, können Sie einfach über Schlüssel oder Index auf Elemente zugreifen. Verwenden Sie das Beispiel aus der von Ihnen verlinkten Frage:

import yaml
with open('tree.yaml', 'r') as f:
    doc = yaml.load(f)

Um darauf zuzugreifen branch1 text, würden Sie verwenden:

txt = doc["treeroot"]["branch1"]
print txt
"branch1 text"

weil in Ihrem YAML-Dokument der Wert des branch1Schlüssels unter dem treerootSchlüssel liegt.

Aphex
quelle
3
Ich erhalte "TypeError: Zeichenfolgenindizes müssen Ganzzahlen sein, nicht str". Es scheint, dass ich keinen String für den Index verwenden kann.
Sattu
Sie versuchen wahrscheinlich, auf eine Zeichenfolge zuzugreifen (diese zu indizieren). Sie könnten zu tief gehen; Sind Sie bereits bei dem Element, auf das Sie zugreifen möchten?
Aphex
@sattu Ich hatte den gleichen Fehler, weil ich kein Leerzeichen zwischen dem Schlüssel und dem Wert hatte, dh "Labelsize: 20" anstelle von "Labelsize: 20"
Mateuszb