Voraussetzungen
Du kennst die Inhalte aus Teil 16 und arbeitest mit einem lokalen Python-3-Interpreter (ab Python 3.10), beispielsweise in Thonny.
Das lernst du in dieser Lektion
- Json.dump und json.load verwenden.
- JSON und Python-Typen zuordnen.
- Dateifehler und ungültige Inhalte unterscheiden.
Struktur statt einzelner Textzeilen
Für eine Filamentverwaltung möchten wir eine Liste mehrerer Rollen speichern. JSON kann solche verschachtelten Strukturen übersichtlich abbilden. Es passt daher besser zu unserer Bestandsliste als eine selbst erfundene Folge aus Textzeilen.
| Python | JSON |
|---|---|
| Dictionary mit Textschlüsseln | Objekt |
| Liste | Array |
| String | String |
| int/gewöhnlicher endlicher float | Zahl |
| True/False | true/false |
| None | null |
JSON verwendet doppelte Anführungszeichen und erlaubt keine normalen Kommentare. Schreibe true nicht in Python-Code; die Übersetzung übernimmt das Modul. Klasseninstanzen werden nicht ohne eigene Umwandlung gespeichert.
Einen Bestand speichern
import json
from pathlib import Path
pfad = Path(__file__).resolve().parent / "bestand.json"
bestand = [
{"material": "PLA", "farbe": "Blau", "rest_g": 750},
{"material": "PETG", "farbe": "Weiß", "rest_g": 420},
]
with pfad.open("w", encoding="utf-8") as datei:
json.dump(bestand, datei, ensure_ascii=False, indent=2, allow_nan=False)
print(f"Gespeichert: {pfad}")
Speichere als json_schreiben.py. indent=2 rückt die JSON-Daten lesbar ein. ensure_ascii=False erhält Umlaute als sichtbare Zeichen. allow_nan=False verhindert, dass nicht endliche Sonderzahlen als nicht standardkonforme JSON-Werte geschrieben werden. Der Schreibmodus überschreibt hier bewusst die Übungsdatei.
Unabhängig wieder laden
Lege im selben Ordner eine zweite Datei json_lesen.py an:
import json
from pathlib import Path
pfad = Path(__file__).resolve().parent / "bestand.json"
try:
with pfad.open("r", encoding="utf-8") as datei:
bestand = json.load(datei)
except FileNotFoundError:
print("Noch kein gespeicherter Bestand vorhanden.")
except json.JSONDecodeError:
print("Die Datei enthält kein gültiges JSON.")
else:
if not isinstance(bestand, list):
print("Der Bestand muss eine Liste sein.")
else:
print(f"Geladene Einträge: {len(bestand)}")
Starte zunächst den Schreiber, danach den Leser. Schließe den Editor und starte den Leser erneut. So siehst du, dass die Daten unabhängig vom vorherigen Programmlauf vorhanden sind.
Gültiges JSON ist nicht automatisch gültiger Bestand
Die JSON-Datei 42 ist formal gültig, aber keine Rollenliste. Selbst eine Liste kann ungeeignete Einträge enthalten. Mit isinstance(wert, list) prüfst du den Typ. Für jeden Eintrag folgen weitere Prüfungen: Ist er ein Dictionary? Gibt es die erwarteten Schlüssel? Sind Material und Farbe nicht leer? Ist die Menge eine endliche, nicht negative Zahl?
Eine beschädigte Datei sollte nicht still als leerer Bestand behandelt und beim Beenden überschrieben werden. Im Abschlussprojekt brechen wir das Laden bei ungültigen Bestandsdaten mit einem Hinweis ab. Die Originaldatei bleibt zur Prüfung erhalten.
Mitmach-Aufgabe
Ändere die Farbe einer Rolle auf Grün, speichere erneut und prüfe sie mit dem Leser. Teste anschließend mit einer Kopie der JSON-Datei einen absichtlich entfernten Beistrich.
Versuche die Aufgabe zuerst selbst. Vergleiche danach deinen Ansatz mit der Musterlösung. Andere Lösungen sind möglich, wenn sie dieselben Anforderungen erfüllen.
Musterlösung
import json
from pathlib import Path
pfad = Path(__file__).resolve().parent / "uebung.json"
daten = [{"material": "PLA", "farbe": "Grün", "rest_g": 500}]
with pfad.open("w", encoding="utf-8") as datei:
json.dump(daten, datei, ensure_ascii=False, indent=2, allow_nan=False)
with pfad.open("r", encoding="utf-8") as datei:
geladen = json.load(datei)
print(geladen[0]["farbe"])
Ergebnis prüfen
Die Ausgabe ist Grün. Den Fehlerfall prüfst du mit einem separaten Leser nach manueller Änderung einer Kopie; der Schreiber würde die beschädigte Datei sonst wieder ersetzen.
Typische Stolperstellen
dump und load arbeiten mit geöffneten Dateien, dumps und loads mit Strings. Ein erfolgreicher JSON-Import ersetzt keine fachliche Datenprüfung.
Was du jetzt kannst
- Json.dump und json.load verwenden.
- JSON und Python-Typen zuordnen.
- Dateifehler und ungültige Inhalte unterscheiden.
Passendes Cheatsheet
Zum Nachschlagen: Cheatsheet 14 – CSV und JSON mit Python. Dort findest du auch den vorhandenen PDF-Download.
Im nächsten Teil
In Teil 18 geht es um Datum, Uhrzeit und Laufzeiten messen. Ergänze Zeitangaben und unterscheide Kalenderzeit von der gemessenen Dauer eines Vorgangs.
