YAML in Python nutzen: Einfache Anleitung mit Beispielen

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.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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

  1. Datei-Existenz prüfen: Vor dem Laden prüfen, ob die Datei existiert, und bei Fehlern eine klare Meldung ausgeben.
  2. Parsing-Fehler abfangen: Bei falscher YAML-Syntax den Fehler gezielt abfangen und informativ melden.
  3. 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.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール