Lerne Coding
YAML in Python lesen und schreiben - Anleitung
20.01.2022

YAML - Laden, Lesen und Schreibe in Python

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

YAML (YAML Ain't Markup Language) ist eine einfache Datenserialisierungssprache, durch das Arbeiten mittels Einrückungen ist sie schon von der Syntax der prädestinierte Datentyp um mit Python zusammenzuarbeiten. Natürlich gibt es YAML Erweiterungen auch für viele andere Sprachen wie zum Beispiel für PHP, GO, C, Dart, Haskell, Java, Rust, Swift.

Auf der offiziellen Webseite von YAML wird es so beschrieben: ⭐ YAML is a human-friendly data serialization language for all programming languages.

Wo sind die Vorteile von YAML gegenüber JSON?

Das Besondere an YAML ist, dass es ebenfalls JSON Syntax unterstützt. Das bedeutet eine YAML File kann auch einfach JSON Syntax enthalten und kann trotzdem geparst werden.

Den YAML ist ein Superset von JSON. Valides JSON ist auch valides YAML. So kannst du deine Konfigurationen schnell auf YAML ändern. Denn auch jeden TYP den du in JSON vorfindest, kannst du mit der YAML Syntax abbilden.

Des Weiteren zu der einfachen Syntax fügt YAML Möglichkeiten hinzu, Typen zu definieren, auch ein Integer in einen Float zu konvertieren ist zum Beispiel möglich.

yaml-ist-toll: !!float 10

Auch mit Verlinkungen kannst du arbeiten, zum Beispiel wenn du an zwei Stellen deines Objektes dieselben Daten benötigst. Mehr dazu findest du weiter unten im Beitrag.

Wie installiere ich die YAML Erweiterung für Python?

Die Installation der YAML Erweiterungen ist mittels PIP möglich. Das Modul heißt “pyyaml” und kann mit folgenden Befehle installiert werden. Dieser Befehle kann bei dir unterschiedlich ausfallen, je nachdem wo und wie du PIP installiert hast. Details hierzu in meinem PIP Artikel.

pip install pyyaml
pip3 install pyyaml
Github Logoyaml/pyyaml
2.426 283 492

Canonical source repository for PyYAML

Wie kann ich YAML Dateien in Python importieren?

Nun wollen wir uns einmal das Laden der YAML Datei via Python im Detail anschauen.

Um mit Python eine YAML Datei einzulesen (auch mit einer YML Dateiendung zu finden) muss du erst einmal, wie du es bereits von Python gewohnt bist, die Datei öffnen. Ich empfehle dir dafür immer einen Context Manager zu verwenden, da dieser das Schließen automatisch für dich übernimmt.

Anschließend können wir unsere YAML/YML Datei auch schon mit safe_load einlesen, es gibt auch eine Variante mit der Lord Methode, diese solltest du aber in der Regel nicht verwenden. Erklärung folgt im nächsten Abschnitt.

Beim Laden kannst du direkt noch einmal Fehler abfangen. Falls keine Fehler auftreten kannst du dann mit deiner YAML Datei weiterarbeiten. Die Variable, die dadurch erstellt wurde, ist ein Dictionary. Mit diesen Daten kannst du nun wieder ganz normal Arbeiten. Im Fall des Fehlers wird in meinem Fall der Fehler ausgegeben und anschließend das Programm beendete. Natürlich kannst du in so einem Fall auch zum Beispiel eine Standardkonfiguration laden.

Gerade dadurch, das Arbeiten mit Arrays, Key Value Objekten und einigen weiteren Optionen, finde ich das Format gerade für aufwendigere Konfigurations-Dateien gut geeignet.

import yaml
import sys

with open("file.yaml") as fileStream:
    try:
        loaded = yaml.safe_load(fileStream)
    except yaml.YAMLError as exception:
        print(exception)
        sys.exit(0)

if loaded:
    print(loaded)

Weshalb du safe_load und nicht load verwenden solltest!

Falls du nicht gewährleisten kannst, dass der Ursprung deiner Daten sicher ist, solltest du immer mit dem SafeLoader arbeiten oder du verwendest direkt die Methode safe_load. Als Beispiel einmal der folgende Code wäre valide und könnte ausgeführt werden. Stell dir vor, eine YAML Datei ruft systeminterne Methoden auf zum Beispiel aus dem OS oder Subprozess Modul.

Aus diesem Grund solltest du immer, wenn du die Quelle der Datei nicht zu 100% vertraust mit dieser Variante arbeiten. Und da man diese nur braucht, wenn du Python Code als Inputs akzeptieren willst. Solltest du standardmäßig erst einmal immer über den SafeLoader Arbeiten.

Einmal ein Beispiel eines kleinen YAML Code, der in Python ausgeführt werden würde. Diese können natürlich auch systeminterne Objekte oder ähnliches sein.

import yaml
import sys

def AngriffsObjekt():
   print("Schädlicher Code")

   sys.exit(0)

conf_str = '''
!!python/object:__main__.AngriffsObjekt
key: 'value'
'''
conf = yaml.load(conf_str,Loader=yaml.Loader)

Mehrere YAML Dokumente aus einer Datei parsen

Eine YAML/YML Datei kann nicht nur ein YAML Dokument enthalten, sondern auch mehrere. Dazu werden die einzelnen Abschnitte mittels --- in mehrere Dokumente aufgeteilt. Das ist zum Beispiel interessant, falls es mehrere größere Objekte für verschiedene Bereiche gibt. Zum Beispiel ein Bereich für Meta Daten und ein anderer für den Inhalt der Seite, die dort daraus generiert werden könnte.

Sobald mehrere Dokumente enthalten sind, muss zum Einlesen eine etwas andere Syntax verwendet werden. Diese ändert sich vor allem darin, dass die Methode safe_load_all verwendet werden muss. Anschließend kannst du das Ganze noch in eine Liste umwandeln, um mit dieser weiterzuarbeiten. Denn safe_load_all gibt erst einmal nur ein Generator zurück.

import yaml
import sys

with open("file.yaml") as fileStream:
    try:
        loaded = list(yaml.safe_load_all(fileStream))
    except yaml.YAMLError as exception:
        print(exception)
        sys.exit(0)

if loaded:
    print(loaded)

Daten als YAML Datei abspeichern in Python

Natürlich kannst du nicht nur Daten aus einer YAML Datei laden und weiter verarbeiten. Du kannst auch deine Daten als YAML Datei speichern. Das ist vor allem dann interessant, wenn zum Beispiel Einstellungen zwischengespeichert werden sollen.

Mittels der Methode safe_dump und safe_dump_all kannst du eine YML Datei erstellen. Wichtig ist, das du zuerst eine FileStream öffnest bevor du die Daten in einer YML/YAML Datei speicherst.

In dem Beispiel ist dataContext unser Dictionary, was in die Datei geschrieben werden soll.

with open('dump.yaml','w') as fileStream:
        yaml.safe_dump(dataContext,fileStream)

Exkurs: YAML Dateien in JSON Dateien konvertieren

Gelegentlich kommt es vor, das du eine YAML in eine JSON Datei konvertieren musst, da ein Programm, mit dem du zusammenarbeiten willst, keine YAML Dateien unterstützt. Letztendlich brauchst du die Option eine YAML Datei zu lesen und in eine JSON Datei zu schreiben. Denn beide Module, sowohl pyyaml als auch json können intern Dictionarys abspeichern. Als Beispiel habe ich eine Funktion geschrieben, die als Parameter eine YAML und JSON Datei Namen nimmt. Die YAML Datei wird geöffnet und eingelesen und danach in eine JSON Datei geschrieben.

import yaml
import json
import sys

def convertYAMLtoJSON(yamlFileName,jsonFileName):
    with open(yamlFileName,'r') as YAMLFile:
        try:
            data = yaml.safe_load(YAMLFile)
        except yaml.YAMLError as exception:
            print(exception)
            sys.exit(0)

    if data: 
        with open(jsonFileName,'w') as JSONFile:
            json.dump(data,JSONFile,indent=4)

# Eingabe und Ausgabe Datei definieren!
convertYAMLtoJSON('file.yaml','file.json')

YAML Datentypen Besonderheiten

Die YAML-Syntax hat ein paar Besonderheiten bzgl. der Datentypen, die natürlich auch das Python-Modul verarbeiten kann. Gerade das Arbeiten mit Verlinkungen finde ich persönlich sehr interessant. Gerade im Zusammenhang mit Konfigurations-Dateien.

Eine komplette Übersicht der möglichen Datentypen und Besonderheiten findest du auch in der offiziellen Dokumentation unter https://yaml.org/type/.

Booleans - mehr als nur True und False

In YAML Dateien kann Alternative zu True & False auch mit Yes, No oder On, Off gearbeitet werden. Gerade um Zustände zu beschreiben ist es manchmal von der Lesbarkeit her angenehmer.

bool1: True
bool2: False
bool3: On
bool4: Off
bool5: yes
bool6: no

Variation von Null

Auch eine Variation von Null ist möglich, mit leerem Feld oder einer ~ (Tilde Zeichen).

null0: 
null1: ~
null2: Null

Arbeiten mit Set in YAML

Auch das Verwenden von SET’s in YAML ist möglich. Die Besonderheit an SETs ist, dass das ein Pool von Werten ist, die keine Rangfolge besitzen. Und beim Parsen zum Beispiel werden doppelte Werte auch entfernt. Da SETs nur unique Werte unterstützen.

Dieser wird auch korrekt in den SET Typ von Python konvertiert, das ist ein weiterer Vorteil gegenüber JSON, das deutlich mehr Datentypen definiert werden können.

setExample: !!set {Rad,Blue,Yellow,Yellow}

Verlinkungen in YAML

Ein Vorteil, den ich persönlich auch sehr interessant finde, ist das Arbeiten mit Verlinkungen bzw. Variablen. Mittels dem & , kaufmännisches und-Zeichen, können Variablen eingeleitet werden, danach kommt die Namensdefinition. Und anschließend kann dieser Wert an einer anderen Stelle mittels * Sternchen eingesetzt werden. Beim Parsen in Python werden dann diese Daten an den Stellen wo die Variable abgerufen wird direkt eingesetzt.

person: &person
  name: felix
  age: 23
  sex: male

house:
  rooms: 6
  water: yes
  owner: *person

Zusammenfassung

YAML ist eine mächtige Möglichkeit, um Daten gerade im Rahmen von Konfigurations-Dateien abzuspeichern. Das ist auch meistens mein Haupteinsatzzweck für YAML.

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "YAML in Python lesen und schreiben - Anleitung"!

Kommentar schreiben

Vom Autor Empfohlen
close