Programme tauschen Daten über standardisierte Formate aus. Die zwei häufigsten sind JSON (strukturierte Daten, überall im Web) und CSV (Tabellen, wie sie Excel exportiert). Beide sind in der Standardbibliothek enthalten.
JSON
JSON (JavaScript Object Notation) sieht fast aus wie Python-Dictionaries und Listen. Die Entsprechungen:
| JSON | Python |
|---|---|
Objekt {...} | dict |
Array [...] | list |
Text "..." | str |
| Zahl | int / float |
true / false | True / False |
null | None |
Python nach JSON-Text
import json
daten = {"name": "Mia", "alter": 17, "hobbys": ["Lesen", "Rad"], "aktiv": True, "partner": None}
text = json.dumps(daten)
print(text)
print(json.dumps(daten, indent=2, ensure_ascii=False)[:60]){"name": "Mia", "alter": 17, "hobbys": ["Lesen", "Rad"], "aktiv": true, "partner": null}
{
"name": "Mia",
"alter": 17,
"hobbys": [
"Lesen",dumps liefert einen Text (dump string), ensure_ascii=False erlaubt Umlaute ohne Maskierung, indent formatiert lesbar.
JSON-Text nach Python
import json
text = '{"produkte": [{"name": "Stift", "preis": 1.5}, {"name": "Heft", "preis": 2.0}]}'
daten = json.loads(text)
print(type(daten))
print(daten["produkte"][1]["name"])
print(sum(p["preis"] for p in daten["produkte"]))<class 'dict'> Heft 3.5
Aus Dateien lesen und in Dateien schreiben
dump und load (ohne s) arbeiten direkt mit Dateien:
import json
einstellungen = {"theme": "dunkel", "schriftgroesse": 14}
with open("einstellungen.json", "w", encoding="utf-8") as f:
json.dump(einstellungen, f, indent=2, ensure_ascii=False)
with open("einstellungen.json", encoding="utf-8") as f:
geladen = json.load(f)
print(geladen == einstellungen, geladen["theme"])True dunkel
Ungültiges JSON löst einen json.JSONDecodeError aus (eine Art ValueError).
CSV
CSV (comma-separated values) speichert eine Tabelle zeilenweise, die Spalten durch Trennzeichen getrennt (in Deutschland oft ;). Das Modul csv übernimmt die Sonderfälle wie Anführungszeichen.
Schreiben
import csv
zeilen = [["Name", "Alter", "Stadt"], ["Mia", 17, "Köln"], ["Tom", 19, "Berlin"]]
with open("leute.csv", "w", newline="", encoding="utf-8") as f:
schreiber = csv.writer(f)
schreiber.writerows(zeilen)
print(open("leute.csv", encoding="utf-8").read())Name,Alter,Stadt Mia,17,Köln Tom,19,Berlin
Lesen
import csv
# Datei vorbereiten
with open("leute.csv", "w", newline="", encoding="utf-8") as f:
f.write("Name,Alter,Stadt\nMia,17,Köln\nTom,19,Berlin\n")
# als Listen
with open("leute.csv", newline="", encoding="utf-8") as f:
for zeile in csv.reader(f):
print(zeile)
# als Dictionaries (Kopfzeile = Schlüssel)
with open("leute.csv", newline="", encoding="utf-8") as f:
for person in csv.DictReader(f):
print(person["Name"], "ist", person["Alter"], "Jahre alt")['Name', 'Alter', 'Stadt'] ['Mia', '17', 'Köln'] ['Tom', '19', 'Berlin'] Mia ist 17 Jahre alt Tom ist 19 Jahre alt
Alle Werte kommen als Text an; Zahlen wandelst du selbst mit int() oder float() um. Ein anderes Trennzeichen gibst du mit delimiter=";" an.
Wann welches Format?
| Format | Gut für |
|---|---|
| JSON | verschachtelte Daten, Web-APIs, Konfigurationen |
| CSV | flache Tabellen, Austausch mit Excel |
Merke
json.dumps/json.loadsfür Text,json.dump/json.loadfür Dateien- JSON-Objekte werden zu
dict, Arrays zulist,nullzuNone csv.writer,csv.reader,csv.DictReaderfür Tabellen- CSV-Werte sind immer Text; Dateien mit
newline=""undencoding="utf-8"öffnen - JSON für verschachtelte Daten, CSV für flache Tabellen
Aufgabe
Speichere eine Liste von Dictionaries (zum Beispiel drei Bücher mit Titel und Jahr) als JSON-Datei, lies sie wieder ein und gib die Titel aus.