YAML
Einleitung
YAML ist eine Markup-Sprache (Auszeichnungssprache) zur seriellen, formatierten Darstellung von Textdaten. Das Akronym YAML steht für YAML Ain’t Markup Language
und wurde ab 2001 von Clark Evans, Brian Ingerson und Oren Ben-Kiki entwickelt.
Ursprünglich basierte YAML auf XML; in der folgenden Entwicklung war es jedoch das Ziel, die die Lesbarkeit der Rohdaten von YAML-Dateien für Menschen zu erhöhen, weshalb YAML heute keine Ähnlichkeit mehr hat mit XML. Der Grundgedanke von YAML ist, dass sich jede mögliche Datenstruktur in Form von assoziativen Listen (Schlüssel-Wert-Paare), Listen und Skalaren (Einzelwerten) darstellen lässt.
Installation
YAML ist ein wichtiges Dateiformat in Python; es folgt die Installationsanleitung der Python-Bindings für YAML in gängigen Betriebssystemen.
Windows
Um Python-YAML zu installieren muss zuerst das Python-Packetmanagementprogramm pip
installiert werden, wie es in dieser Anleitung beschrieben ist.
Mac-OSX
Die Installation auf Mac/OSX benötigt ebenfalls die Installation von pip
. Dies erfolgt durch die Eingabe von
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
im Terminal.
Alle Systeme
Die Python-Bindings für YAML werden mit folgender Eingabe installiert:
pip install pyyaml
Grundlagen
YAML-Dateien sind einfache Textdateien, die mit der Endung .yaml
gespeichert werden. Dabei darf eine YAML-Datei beliebige Zeichen außer Einrückung via Tabulator enthalten.
Eine YAMl-Datei ist eine Reihe von Skalaren, Listen und assoziativen Listen. Listen und assoziative Listen können entweder in Block- oder in Inline-Darstellung definiert werden. Beide Optionen werden im folgenden gezeigt.
Skalare
Skalare sind Einzelwerte und können entweder Strings, Zahlen oder bool'sche Werte sein. Strings können sowohl mit einfachen als auch mit doppelten Anführungszeichen gekennzeichnet werden.
number-value: 42 gleitkomma-wert: 3.141592 bool-wert: true string-wert: 'Hallo'
Dies entspricht den Python-Variablen
gleitkomma-wert = 3.141592 bool-wert = True string-wert = 'Hallo'
Strings werden, sofern dies möglich ist, auch ohne Anführungszeichen erkannt. Die folgende Zeile ist daher ebenfalls gültiges YAML:
string-wert = Hallo
Listen
Listenelemente werden in der Block-Schreibweise mittels Einrückung und einem Minuszeichen dargestellt:
ritter: - Lancelot - Gallahead - Arthur
Dies entspricht der Python-Liste
ritter = ["Lancelot", "Gallahead", "Arthur"]
In der Inline-Darstellung sieht dieselbe Liste folgendermaßen aus:
ritter: [Lancelot, Gallahead, Arthur]
Assoziative Listen
Assoziative Listen entsprechen Python-Dictionaries. Sie können beliebige Datentypen enthalten. Die Elemente einer assoziativen Liste werden per Einrückung getrennt.
Beachte: Auf den Doppelpunkt des Schlüssels muss ein Leerzeichen und dann der Wert folgen!
zählen: eins: false zwei: false drei: true vier: 'nein' fünf: 'ganz falsch'
Dies entspricht dem Python-Dictionary
zählen = {"eins": false, "zwei": false, "drei": true, 'vier': 'nein', 'fünf': 'ganz falsch'}
Die Inline-Darstellung dieser assoziativen Liste sieht so aus:
zählen: {eins: false, zwei: false, drei: true, vier: nein, fünf: ganz falsch}
Fortgeschritten
Schachtelung
Die in den Grundlagen vorgestellten, essentiellen Datentypen von YAMl können beliebig ineinander geschachtelt werden:
daten: - unbeladene-schwalbe: 0.5 - gelb: false grün: true
Dies entspricht der folgenden Python-Datenstruktur:
daten = [{'unbeladene-schwalbe': 0.5}, {'gelb': False, 'grün': True}]
Kommentare
Kommentare werden mit dem Rautezeichen markiert und können an beliebiger Stelle positioniert werden:
daten: # Afrikanisch oder Europäisch? - unbeladene-schwalbe: 0.5
Multiple Dokumente
Innerhalb einer einzigen YAML-Datei können multiple Dokumente definiert werden. Diese werden mittels dreier Minuszeichen voneinander getrennt.
Beachte: Auf ein solches Trennzeichen sollte kein Kommentar in der gleichen Zeile folgen!
name: 'John' --- name: 'Terry'
Sonderzeichen
Die Sonderzeichen ` [] {} : > | `
können in einem String nur verwendet werden, wenn dieser String mit Anführungszeichen eingefasst wurde:
sonderzeichen: "[alle] {eingefasst} :wie> hier|"
Textformatierung
Mit dem Operator |
wird die Einrückung inklusive Umbrüchen eines Strings beibehalten:
der papagei ist mausetot!
Gegensätzlich dazu bewirkt der Operator >
, dass Zeilenumbrüche zusammengefasst werden. Dabei werden Paragraphen mit einer Leerzeile getrennt.
der papagei, der ist nicht mehr! der papagei ist mausetot!
Ausgabe:
der papagei, der ist nicht mehr! der papagei ist mausetot!
YAML in Python
Die Einbindung von YAML in Python erfolgt denkbar einfach mit load
zur Konvertierung von eines YAML-Strings in ein Python-Objekt und mit dump
zur Konvertierung eines Python-Objektes in einen YAML-String:
import yaml data = """zahl: 3.1415926536 string: 'hallo welt' ritter: - Lancelot - Gallahead - Arthur""" python_yaml = yaml.load(data) print(python_yaml) print(yaml.dump(python_yaml))
Das Ausführen mit Python erzeugt die folgende Ausgabe:
{'zahl': 3.1415926536, 'string': 'hallo welt', 'ritter': ['Lancelot', 'Gallahead', 'Arthur']} ritter: - Lancelot - Gallahead - Arthur string: hallo welt zahl: 3.1415926536
Anstatt die YAML-Struktur im Programm als String zu definieren, kann natürlich der Inhalt einer beliebigen .yml
-Datei geladen und verwendet werden!