1. Was ist YAML?
Überblick über YAML
YAML (YAML Ain’t Markup Language) ist ein Daten-Serialisierungsformat, das häufig zur Darstellung strukturierter Daten verwendet wird. Es ähnelt JSON oder XML, zeichnet sich jedoch durch seine Einfachheit und hohe Lesbarkeit aus. Besonders vorteilhaft ist, dass YAML durch Einrückungen hierarchische Strukturen darstellen kann, was das Format für Menschen besonders leicht lesbar macht.
Unterschiede zu JSON und XML
JSON und XML dienen ebenfalls zur Beschreibung von Daten, jedoch hat YAML im Vergleich weniger redundante Symbole und ist dadurch einfacher und verständlicher. Zum Beispiel nutzt JSON viele geschweifte Klammern {}
und Kommata ,
, was bei großen Datenmengen die Übersicht erschweren kann. YAML hingegen stellt die Struktur durch Einrückungen dar, sodass die Hierarchie der Daten visuell leichter nachvollziehbar ist.
Gute Kompatibilität mit Python
Die Syntax von Python basiert auf Einrückungen zur Blockdarstellung, was eine hohe Kompatibilität mit YAML-Formaten bietet. Mithilfe der Python-Bibliothek „PyYAML“ lassen sich YAML-Dateien einfach lesen und schreiben, weshalb sie häufig als Konfigurationsdateien genutzt werden.

2. YAML-Dateien in Python lesen und schreiben
YAML-Dateien lesen
Um YAML-Dateien in Python zu laden, muss zunächst die Bibliothek „PyYAML“ installiert werden. Anschließend wird die Funktion yaml.safe_load()
verwendet. Diese Funktion konvertiert YAML-Daten auf sichere Weise in Python-Dictionaries oder -Listen. Ein einfaches Beispiel sieht wie folgt aus:
import yaml
# YAML-Datei öffnen und Inhalte laden
with open('config.yaml', 'r') as file:
data = yaml.safe_load(file)
print(data)
Dieser Code liest eine YAML-Datei und speichert die Inhalte in einem Python-Dictionary. Beispiel für eine YAML-Datei:
database:
host: localhost
port: 3306
Das resultierende Dictionary in Python sieht so aus:
{'database': {'host': 'localhost', 'port': 3306}}
YAML-Dateien schreiben
Um Python-Daten im YAML-Format zu speichern, wird die Funktion yaml.dump()
genutzt. Beispiel:
import yaml
data = {
'name': 'John Doe',
'age': 30,
'city': 'New York'
}
with open('output.yaml', 'w') as file:
yaml.dump(data, file)
Dieser Code speichert das Dictionary data
in einer Datei output.yaml
. Das Ergebnis sieht so aus:
age: 30
city: New York
name: John Doe
Umgang mit Unicode
Wenn YAML-Dateien nicht-lateinische Zeichen (z. B. Japanisch oder Deutsch mit Umlauten) enthalten, ist es wichtig, die Option allow_unicode=True
zu verwenden, um Darstellungsfehler zu vermeiden:
yaml.dump(data, file, allow_unicode=True)

3. Erweiterte YAML-Operationen
Erstellen von benutzerdefinierten Tags
YAML kann nicht nur grundlegende Datentypen (Listen, Dictionaries usw.) verarbeiten, sondern auch Python-Objekte serialisieren und deserialisieren. Dafür werden benutzerdefinierte Tags verwendet. Beispiel für das Speichern einer Python-Klasse im YAML-Format:
import yaml
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def person_representer(dumper, data):
return dumper.represent_mapping('!Person', {'name': data.name, 'age': data.age})
def person_constructor(loader, node):
values = loader.construct_mapping(node)
return Person(values['name'], values['age'])
yaml.add_representer(Person, person_representer)
yaml.add_constructor('!Person', person_constructor)
# Objekt in YAML speichern
person = Person('Alice', 25)
with open('person.yaml', 'w') as file:
yaml.dump(person, file)
# Objekt aus YAML rekonstruieren
with open('person.yaml', 'r') as file:
loaded_person = yaml.load(file, Loader=yaml.FullLoader)
So lassen sich Python-Objekte im YAML-Format speichern und später wiederverwenden.
Beibehaltung der Reihenfolge
Da PyYAML standardmäßig die Reihenfolge von Dictionary-Schlüsseln nicht garantiert, empfiehlt sich in Fällen, in denen die Reihenfolge wichtig ist, die Nutzung von ruamel.yaml
. Diese Bibliothek erhält die Schlüsselreihenfolge und ist daher für Konfigurationsdateien, bei denen die Reihenfolge entscheidend ist, besonders nützlich.

4. YAML als Konfigurationsdatei
Vorteile von YAML als Konfigurationsdatei
YAML wird häufig als Konfigurationsdatei verwendet, insbesondere in Python-Anwendungen. Dank der hohen Lesbarkeit und klaren Struktur eignet sich YAML hervorragend zur Verwaltung komplexer Einstellungen wie Datenbankzugänge oder Logging-Konfigurationen.
database:
host: localhost
port: 3306
username: user
password: pass
logging:
level: DEBUG
file: /var/log/app.log
Mehrere Einstellungen lassen sich so klar und übersichtlich beschreiben.
Einsatz in realen Projekten
YAML wird in einer Vielzahl von Projekten genutzt, darunter Python-Frameworks wie Django und Flask, CI/CD-Tools wie CircleCI sowie Container-Orchestrierung mit Kubernetes. Hauptsächlich dient YAML dort der Konfigurationsverwaltung und Definition von Umgebungsvariablen.
Beispiel mit Django:
import yaml
with open('config.yaml', 'r') as file:
config = yaml.safe_load(file)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': config['database']['name'],
'USER': config['database']['username'],
'PASSWORD': config['database']['password'],
'HOST': config['database']['host'],
'PORT': config['database']['port'],
}
}
Vergleich mit JSON und XML
Im Vergleich zu JSON und XML ist YAML als Konfigurationsformat besonders praktisch. JSON wird durch Klammern und Kommata oft unübersichtlich, XML durch Start- und Endtags zu redundant. YAML hingegen stellt die Struktur über Einrückungen dar und ist dadurch intuitiver.
Vergleich JSON vs YAML:
{
"database": {
"host": "localhost",
"port": 3306,
"username": "user",
"password": "pass"
},
"logging": {
"level": "DEBUG",
"file": "/var/log/app.log"
}
}
database:
host: localhost
port: 3306
username: user
password: pass
logging:
level: DEBUG
file: /var/log/app.log
Der Vergleich zeigt deutlich, dass YAML einfacher und übersichtlicher ist.

5. Fehlersuche und Fehlerbehandlung
Häufige Fehler und Lösungen
Typische Fehler beim Umgang mit YAML-Dateien sind „Datei nicht gefunden“ oder ein fehlerhaftes Format. Solche Probleme lassen sich durch geeignete Fehlerbehandlung vermeiden.
Bei einem Parsing-Fehler kann die Ausnahme yaml.YAMLError
abgefangen werden. Ist die Datei nicht vorhanden, kann FileNotFoundError
behandelt und eine Meldung ausgegeben werden:
import yaml
def load_yaml(file_path):
try:
with open(file_path, 'r') as file:
data = yaml.safe_load(file)
except FileNotFoundError:
print(f"Error: Die Datei {file_path} existiert nicht.")
return None
except yaml.YAMLError as e:
print(f"Error: YAML konnte nicht geparst werden. {e}")
return None
return data
config = load_yaml('config.yaml')
if config:
print(config)
Best Practices für Fehlerbehandlung
- Datei-Existenz prüfen: Vor dem Laden prüfen, ob die Datei existiert, und bei Fehlern eine klare Meldung ausgeben.
- Parsing-Fehler abfangen: Bei falscher YAML-Syntax den Fehler gezielt abfangen und informativ melden.
- Logging nutzen: Fehler und Warnungen in Log-Dateien schreiben, um die spätere Analyse zu erleichtern.
6. Fazit
YAML ist ein leicht verständliches und menschenlesbares Datenformat. Mit Python lässt sich YAML sehr einfach lesen und schreiben, wodurch es für Konfigurationsdateien ideal geeignet ist. Erweiterte Features wie benutzerdefinierte Tags, Objekt-Serialisierung oder die Reihenfolge-Beibehaltung machen YAML besonders flexibel.
Neben der Konfigurationsverwaltung findet YAML auch als allgemeines Speicherformat breite Anwendung und wird in Zukunft in vielen Projekten eine zentrale Rolle spielen.