CSV in JSON konvertieren mit Python — json.dumps()
Nutze das kostenlose CSV to JSON direkt im Browser – keine Installation erforderlich.
CSV to JSON online testen →CSV-Dateien begegnen einem überall — exportierte Berichte, Datenbank-Dumps, Log-Auszüge — und früher oder später muss man CSV in Python in JSON konvertieren. Die Standardbibliothek erledigt das mit zwei Modulen: csv.DictReader wandelt jede Zeile in ein Python-Dict um, und json.dumps() serialisiert diese Dicts in einen JSON-String. Für eine schnelle Einmal-Konvertierung ohne Code erledigt der CSV-zu-JSON-Konverter das sofort im Browser. Dieser Leitfaden deckt den vollständigen programmatischen Weg ab: json.dump() vs json.dumps(), JSON in Dateien schreiben, Dataclass-Serialisierung, Typ-Konvertierung für CSV-Werte, Umgang mit datetime und Decimal sowie leistungsstarke Alternativen wie orjson. Alle Beispiele sind auf Python 3.10+ ausgelegt.
- ✓csv.DictReader erzeugt eine Liste von Dicts — die vollständige Liste mit json.dump(rows, f, indent=2) in eine JSON-Datei schreiben.
- ✓json.dump() schreibt direkt in ein Datei-Objekt. json.dumps() gibt einen String zurück. Die richtige Wahl vermeidet eine unnötige Kopie im Arbeitsspeicher.
- ✓CSV-Werte sind immer Strings. Numerische Spalten vor der JSON-Serialisierung explizit umwandeln (int(), float()).
- ✓ensure_ascii=False an json.dumps() übergeben, um Unicode-Zeichen — Umlaute, CJK-Text — in der Ausgabe zu erhalten.
- ✓Für datetime, UUID oder Decimal aus CSV den default=-Parameter mit einer benutzerdefinierten Fallback-Funktion verwenden.
order_id,product,quantity,price ORD-7291,Wireless Keyboard,2,49.99 ORD-7292,USB-C Hub,1,34.50
[
{
"order_id": "ORD-7291",
"product": "Wireless Keyboard",
"quantity": "2",
"price": "49.99"
},
{
"order_id": "ORD-7292",
"product": "USB-C Hub",
"quantity": "1",
"price": "34.50"
}
]"2", "49.99"). CSV kennt kein Typsystem — jeder Wert ist ein String. Die Behebung wird im Abschnitt zur Typ-Konvertierung weiter unten behandelt.json.dumps() — Ein Python-Dict in einen JSON-String serialisieren
Das json Modul ist in jeder Python-Installation enthalten — kein pip install erforderlich. json.dumps(obj) nimmt ein Python-Objekt (dict, list, string, Zahl, bool oder None) und gibt einen str mit gültigem JSON zurück. Ein Python-Dictionary sieht einem JSON-Objekt ähnlich, aber sie sind grundlegend verschieden: Ein Dict ist eine Python-Datenstruktur im Arbeitsspeicher, ein JSON-String ist serialisierter Text. Der Aufruf von json.dumps() überbrückt diese Lücke.
Minimalbeispiel — Eine einzelne CSV-Zeile als JSON
import json
# Eine einzelne CSV-Zeile als Python-Dict
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
# Dict in JSON-String konvertieren
json_string = json.dumps(server_entry)
print(json_string)
# {"hostname": "web-prod-03", "ip_address": "10.0.12.47", "port": 8080, "region": "eu-west-1"}
print(type(json_string))
# <class 'str'>Das erzeugt kompaktes, einzeiliges JSON — gut für Payloads und Speicherung, schwer lesbar. Mit indent=2 erhält man eine menschenlesbare Ausgabe:
import json
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
pretty_json = json.dumps(server_entry, indent=2)
print(pretty_json)
# {
# "hostname": "web-prod-03",
# "ip_address": "10.0.12.47",
# "port": 8080,
# "region": "eu-west-1"
# }Zwei weitere Parameter, die ich bei fast jedem Aufruf verwende: sort_keys=True sortiert Dictionary-Schlüssel alphabetisch (praktisch zum Vergleichen von JSON-Dateien über Versionen hinweg), und ensure_ascii=False erhält Nicht-ASCII-Zeichen, anstatt sie in \uXXXX Sequenzen zu escapen.
import json
warehouse_record = {
"sku": "WH-9031",
"location": "München Lager 3",
"quantity": 240,
"last_audit": "2026-03-10"
}
output = json.dumps(warehouse_record, indent=2, sort_keys=True, ensure_ascii=False)
print(output)
# {
# "last_audit": "2026-03-10",
# "location": "München Lager 3",
# "quantity": 240,
# "sku": "WH-9031"
# }Kurzer Hinweis zum separators Parameter: Der Standard ist (", ", ": "), was Leerzeichen nach Kommas und Doppelpunkten einfügt. Für die kompaktestmögliche Ausgabe (nützlich beim Einbetten von JSON in URL-Parameter oder um Bytes aus API-Antworten herauszuholen) kann separators=(",", ":") übergeben werden.
json.dumps() konvertiert Python True zu JSON true, None zu null und umschließt Strings mit doppelten Anführungszeichen (Python erlaubt einfache Anführungszeichen, JSON nicht). Immer json.dumps() verwenden, um gültiges JSON zu erzeugen — nie auf str() oder repr() verlassen.csv.DictReader zu JSON-Datei — Die vollständige Pipeline
Die häufigste Aufgabe in der Praxis ist das Einlesen einer vollständigen CSV-Datei und das Speichern als JSON. Hier ist das vollständige Skript in unter 10 Zeilen. csv.DictReader erzeugt einen Iterator von dict Objekten — eines pro Zeile, wobei die erste Zeile als Schlüssel verwendet wird. Das Einschließen in list() sammelt alle Zeilen in einer Python-Liste, die als JSON-Array serialisiert wird.
import csv
import json
# Schritt 1: CSV-Zeilen in eine Liste von Dicts einlesen
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
# Schritt 2: Die Liste als JSON-Datei schreiben
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)
print(f"Converted {len(rows)} rows to inventory.json")Zwei open() Aufrufe: einer zum Lesen der CSV, einer zum Schreiben des JSON. Das ist das gesamte Muster. Zu beachten: hier wird json.dump() (ohne das s) verwendet — es schreibt direkt in den Datei-Handle. Die Verwendung von json.dumps() würde einen String zurückgeben, den man dann separat mit f.write() schreiben müsste. json.dump() ist arbeitsspeicher-effizienter, da es die Ausgabe streamt, anstatt den gesamten String zuerst im Arbeitsspeicher aufzubauen.
Wenn das JSON als String benötigt wird — zum Einbetten in einen API-Payload, zur Ausgabe auf stdout oder zum Einfügen in eine Datenbankspalte — stattdessen json.dumps() verwenden:
import csv
import json
with open("sensors.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# JSON als String statt in eine Datei schreiben
json_payload = json.dumps(rows, indent=2)
print(json_payload)
# [
# {
# "sensor_id": "TMP-4401",
# "location": "Gebäude 7 - Etage 2",
# "reading": "22.4",
# "unit": "celsius"
# },
# ...
# ]Einzelne Zeile vs. vollständiger Datensatz: Mit json.dumps(single_dict) erhält man ein JSON-Objekt ({...}). Mit json.dumps(list_of_dicts) erhält man ein JSON-Array ([{...}, {...}]). Die Form des äußeren Containers hängt davon ab, was übergeben wird. Die meisten nachgelagerten Verbraucher erwarten ein Array für tabellarische Daten.
Umgang mit Nicht-String-Werten — Typ-Konvertierung aus CSV
Das ist das Problem, das jeden beim ersten Mal überrascht: csv.DictReader gibt jeden Wert als String zurück. Die Zahl 42 in der CSV wird zum String "42" im Dict. Wenn man das direkt mit json.dumps() serialisiert, enthält das JSON "quantity": "42" statt "quantity": 42. APIs, die Typen validieren, werden das ablehnen. Werte müssen explizit umgewandelt werden.
import csv
import json
def coerce_types(row: dict) -> dict:
"""String-Werte in passende Python-Typen umwandeln."""
return {
"sensor_id": row["sensor_id"],
"location": row["location"],
"temperature": float(row["temperature"]),
"humidity": float(row["humidity"]),
"battery_pct": int(row["battery_pct"]),
"active": row["active"].lower() == "true",
}
with open("sensor_readings.csv", "r", encoding="utf-8") as f:
rows = [coerce_types(row) for row in csv.DictReader(f)]
print(json.dumps(rows[0], indent=2))
# {
# "sensor_id": "TMP-4401",
# "location": "Gebäude 7 - Etage 2",
# "temperature": 22.4,
# "humidity": 58.3,
# "battery_pct": 87,
# "active": true
# }Nun ist temperature ein Float, battery_pct eine Ganzzahl und active ein Boolean in der JSON-Ausgabe. Die Konvertierungsfunktion ist spezifisch für das CSV-Schema — es gibt keine allgemeine Möglichkeit, Typen aus CSV-Daten zu erraten; daher schreibe ich eine Funktion pro CSV-Format.
Benutzerdefinierte Objekte und nicht standardmäßige Typen serialisieren
Pythons json Modul kann datetime, UUID, Decimal oder benutzerdefinierte Klassen nicht von Haus aus serialisieren. Der Aufruf von json.dumps() auf einem dieser Typen löst einen TypeError aus. Zwei Ansätze lösen dieses Problem.
Ansatz 1: Der default= Parameter
Eine Funktion an default= übergeben, die unbekannte Typen in etwas Serialisierbares umwandelt. Diese Funktion wird nur für Objekte aufgerufen, die der JSON-Encoder nicht verarbeiten kann.
import json
from datetime import datetime
from decimal import Decimal
from uuid import UUID
def json_serial(obj):
"""Fallback-Serializer für nicht standardmäßige Typen."""
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, UUID):
return str(obj)
if isinstance(obj, Decimal):
return float(obj)
raise TypeError(f"Type {type(obj).__name__} is not JSON serializable")
transaction = {
"txn_id": UUID("a1b2c3d4-e5f6-7890-abcd-ef1234567890"),
"amount": Decimal("149.99"),
"currency": "EUR",
"processed_at": datetime(2026, 3, 15, 14, 30, 0),
"gateway": "stripe",
}
print(json.dumps(transaction, indent=2, default=json_serial))
# {
# "txn_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
# "amount": 149.99,
# "currency": "EUR",
# "processed_at": "2026-03-15T14:30:00",
# "gateway": "stripe"
# }default= Funktion für unbekannte Typen immer TypeError auslösen. Wird stattdessen None zurückgegeben oder der Typ stillschweigend übersprungen, erscheint null in der Ausgabe ohne Hinweis darauf, dass Daten verloren gegangen sind.Ansatz 2: Dataclasses mit asdict()
Python-Dataclasses geben den CSV-Zeilen eine ordentliche Typdefinition. Mit dataclasses.asdict() eine Dataclass-Instanz in ein einfaches Dict umwandeln und dann an json.dumps() übergeben.
import json
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class ShipmentRecord:
tracking_id: str
origin: str
destination: str
weight_kg: float
shipped_at: datetime
def json_serial(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Not serializable: {type(obj).__name__}")
shipment = ShipmentRecord(
tracking_id="SHP-9827",
origin="Hamburg",
destination="Frankfurt",
weight_kg=1240.5,
shipped_at=datetime(2026, 3, 12, 8, 0, 0),
)
print(json.dumps(asdict(shipment), indent=2, default=json_serial))
# {
# "tracking_id": "SHP-9827",
# "origin": "Hamburg",
# "destination": "Frankfurt",
# "weight_kg": 1240.5,
# "shipped_at": "2026-03-12T08:00:00"
# }asdict() konvertiert verschachtelte Dataclasses rekursiv in Dicts. Wenn eine Dataclass eine Liste anderer Dataclasses enthält, wird der gesamte Baum konvertiert — kein zusätzlicher Code erforderlich.json.dumps() Parameter-Referenz
Vollständige Liste der Schlüsselwortargumente, die von json.dumps() und json.dump() akzeptiert werden. Beide Funktionen akzeptieren identische Parameter — json.dump() nimmt ein zusätzliches erstes Argument für das Datei-Objekt entgegen.
csv.DictReader — CSV in Python-Dicts einlesen
csv.DictReader ist die zweite Hälfte der CSV-zu-JSON-Pipeline. Es umschließt ein Datei-Objekt und liefert ein dict pro Zeile, wobei die erste Zeile als Feldnamen verwendet wird. Im Vergleich zu csv.reader (der einfache Listen liefert) bietet DictReader benannten Zugriff auf Spalten — keine magischen Indizes wie row[3].
import csv
import json
# Tab-getrennte Datei aus einem Datenbankexport
with open("user_sessions.tsv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter="\t")
sessions = list(reader)
print(json.dumps(sessions[:2], indent=2))
# [
# {
# "session_id": "sess_8f2a91bc",
# "user_id": "usr_4421",
# "started_at": "2026-03-15T09:12:00Z",
# "duration_sec": "342",
# "pages_viewed": "7"
# },
# {
# "session_id": "sess_3c7d44ef",
# "user_id": "usr_1187",
# "started_at": "2026-03-15T09:14:22Z",
# "duration_sec": "128",
# "pages_viewed": "3"
# }
# ]csv.DictReader liest die gesamte Datei lazy — es liefert Zeilen einzeln. Der Aufruf von list(reader) lädt alle Zeilen in den Arbeitsspeicher. Bei Dateien mit Millionen von Zeilen die Zeilen stattdessen per Streaming verarbeiten, statt alle auf einmal zu sammeln.CSV aus Datei und API-Antwort konvertieren
Zwei Produktionsszenarien: eine CSV-Datei von der Festplatte lesen und konvertieren, sowie CSV-Daten von einem API-Endpunkt abrufen (viele Reporting-Dienste liefern CSV zurück). Beide benötigen ordentliche Fehlerbehandlung.
CSV-Datei lesen → Konvertieren → JSON schreiben
import csv
import json
import sys
def csv_to_json_file(csv_path: str, json_path: str) -> int:
"""Konvertiert eine CSV-Datei in JSON. Gibt die Anzahl der geschriebenen Zeilen zurück."""
try:
with open(csv_path, "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
except FileNotFoundError:
print(f"Error: {csv_path} not found", file=sys.stderr)
sys.exit(1)
except csv.Error as e:
print(f"CSV parse error in {csv_path}: {e}", file=sys.stderr)
sys.exit(1)
with open(json_path, "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False)
return len(rows)
count = csv_to_json_file("fleet_vehicles.csv", "fleet_vehicles.json")
print(f"Wrote {count} records to fleet_vehicles.json")CSV von API abrufen → Verarbeiten → JSON
import csv
import io
import json
import urllib.request
def fetch_csv_as_json(url: str) -> str:
"""CSV von einer URL abrufen und als JSON-String zurückgeben."""
try:
with urllib.request.urlopen(url, timeout=10) as resp:
raw = resp.read().decode("utf-8")
except urllib.error.URLError as e:
raise RuntimeError(f"Failed to fetch {url}: {e}")
reader = csv.DictReader(io.StringIO(raw))
rows = list(reader)
if not rows:
raise ValueError("CSV response was empty or had no data rows")
return json.dumps(rows, indent=2, ensure_ascii=False)
# Beispiel: Export-Endpunkt, der CSV zurückgibt
try:
result = fetch_csv_as_json("https://reports.internal/api/v2/daily-metrics.csv")
print(result)
except (RuntimeError, ValueError) as e:
print(f"Error: {e}")Beide Beispiele verwenden explizites encoding="utf-8" bei jedem Datei-Öffnen. Das ist wichtig für CSV-Dateien mit Nicht-ASCII-Zeichen — Umlaute, Adressen mit Sonderzeichen, CJK-Text. Ohne explizite Kodierung fällt Python auf den Systemstandard zurück, der unter Windows häufig cp1252 ist und Mehrbytezeichen stillschweigend korrumpiert.
JSON-Ausgabe mit json.loads() verifizieren
Nach der Konvertierung von CSV in einen JSON-String kann das Ergebnis durch erneutes Parsen mit json.loads() verifiziert werden. Dieser Round-Trip fängt Kodierungsprobleme, fehlerhafte Escape-Sequenzen oder versehentliche String-Verkettungen ab, die ungültiges JSON erzeugen würden. Den Aufruf in einem try/except-Block einschließen.
import json
json_string = json.dumps({"order_id": "ORD-7291", "total": 129.99})
# Gültigkeit prüfen durch erneutes Parsen
try:
parsed = json.loads(json_string)
print(f"Valid JSON with {len(parsed)} keys")
except json.JSONDecodeError as e:
print(f"Invalid JSON: {e}")
# Valid JSON with 2 keysCSV-zu-JSON-Konvertierung auf der Kommandozeile
Schnelle Konvertierungen im Terminal — kein Skript erforderlich. Pythons -c Flag führt Inline-Code aus, und das Ergebnis kann durch python3 -m json.tool zur Formatierung geleitet werden.
python3 -c " import csv, json, sys rows = list(csv.DictReader(sys.stdin)) json.dump(rows, sys.stdout, indent=2) " < inventory.csv > inventory.json
python3 -c "import csv,json,sys; print(json.dumps(list(csv.DictReader(sys.stdin))))" < data.csv | python3 -m json.tool
python3 -c "import csv,json,sys; json.dump(list(csv.DictReader(sys.stdin)),sys.stdout)" < report.csv | jq .
python3 -m json.tool ist der eingebaute JSON-Formatierer. Er liest JSON von stdin, validiert es und gibt es mit 4-Leerzeichen-Einrückung aus. Nützlich zur Überprüfung, ob die CSV-zu-JSON-Konvertierung gültige Ausgabe erzeugt hat. Wer 2-Leerzeichen-Einrückung bevorzugt oder Filterung benötigt, verwendet stattdessen jq.Hochleistungsalternative — orjson
Das eingebaute json Modul funktioniert für die meisten CSV-Dateien einwandfrei. Wenn jedoch Datensätze mit Zehntausenden von Zeilen in einer Schleife verarbeitet werden oder eine API CSV-abgeleitete Daten bei jeder Anfrage serialisieren muss, ist orjson 5–10x schneller. Es ist in Rust geschrieben, gibt bytes statt str zurück und serialisiert datetime, UUID und numpy Arrays nativ ohne benutzerdefinierte default= Funktion.
pip install orjson
import csv
import orjson
with open("telemetry_events.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# orjson.dumps() gibt bytes zurück, nicht str
json_bytes = orjson.dumps(rows, option=orjson.OPT_INDENT_2)
with open("telemetry_events.json", "wb") as f: # Hinweis: "wb" für bytes
f.write(json_bytes)
print(f"Wrote {len(rows)} events ({len(json_bytes)} bytes)")Die API ist leicht anders: orjson.dumps() gibt bytes zurück und verwendet option= Flags statt Schlüsselwortargumenten. Dateien im binären Schreibmodus ("wb") öffnen, wenn orjson-Ausgabe geschrieben wird. Wenn ein String benötigt wird, .decode("utf-8") auf das Ergebnis aufrufen.
Terminal-Ausgabe mit Syntaxhervorhebung — rich
Das Debuggen von CSV-zu-JSON-Konvertierungen im Terminal wird mit farbiger Ausgabe einfacher. Die rich Bibliothek stellt JSON mit Syntaxhervorhebung dar — Schlüssel, Strings, Zahlen und Booleans erhalten jeweils eine eigene Farbe.
pip install rich
import csv
import json
from rich.console import Console
from rich.syntax import Syntax
console = Console()
with open("deployment_log.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
json_output = json.dumps(rows[:3], indent=2, ensure_ascii=False)
syntax = Syntax(json_output, "json", theme="monokai", line_numbers=True)
console.print(syntax)rich fügt der Ausgabe ANSI-Escape-Codes hinzu. Rich-formatierte Ausgabe nicht in eine Datei oder eine API-Antwort schreiben — sie enthält unsichtbare Steuerzeichen. rich nur für die Terminal-Anzeige verwenden.Mit großen CSV-Dateien arbeiten
Eine 500 MB große CSV-Datei mit list(csv.DictReader(f)) zu laden, belegt den gesamten Datensatz im Arbeitsspeicher, und json.dump() baut darüber hinaus den vollständigen JSON-String auf. Für Dateien größer als 50–100 MB auf einen Streaming-Ansatz umstellen oder NDJSON (Newline-Delimited JSON) schreiben — ein JSON-Objekt pro Zeile.
NDJSON — Ein JSON-Objekt pro Zeile
import csv
import json
def csv_to_ndjson(csv_path: str, ndjson_path: str) -> int:
"""CSV in NDJSON konvertieren, eine Zeile nach der anderen verarbeiten."""
count = 0
with open(csv_path, "r", encoding="utf-8") as infile, \
open(ndjson_path, "w", encoding="utf-8") as outfile:
for row in csv.DictReader(infile):
outfile.write(json.dumps(row, ensure_ascii=False) + "\n")
count += 1
return count
rows_written = csv_to_ndjson("access_log.csv", "access_log.ndjson")
print(f"Wrote {rows_written} lines to access_log.ndjson")
# Jede Zeile ist ein eigenständiges JSON-Objekt:
# {"timestamp":"2026-03-15T09:12:00Z","method":"GET","path":"/api/v2/orders","status":"200"}
# {"timestamp":"2026-03-15T09:12:01Z","method":"POST","path":"/api/v2/payments","status":"201"}Streaming mit ijson für große JSON-Eingaben
import ijson # pip install ijson
def count_high_value_orders(json_path: str, threshold: float) -> int:
"""Bestellungen über einem Schwellenwert zählen, ohne die gesamte Datei zu laden."""
count = 0
with open(json_path, "rb") as f:
for item in ijson.items(f, "item"):
if float(item.get("total", 0)) > threshold:
count += 1
return count
# Eine 2 GB JSON-Datei mit konstantem Arbeitsspeicherbedarf verarbeiten
high_value = count_high_value_orders("all_orders.json", 500.0)
print(f"Found {high_value} orders above $500")ijson ist zum Lesen großer JSON-Dateien gedacht — für die Schreibseite hält das obige NDJSON-Muster den Arbeitsspeicherbedarf unabhängig von der Dateigröße konstant.Häufige Fehler
Problem: json.dumps() gibt einen String zurück. Das Schreiben mit f.write() funktioniert zwar, erzeugt aber einen unnötigen Zwischen-String im Arbeitsspeicher — verschwendet Ressourcen bei großen Datensätzen.
Lösung: json.dump(data, f) verwenden, um direkt in das Datei-Objekt zu schreiben. Es streamt die Ausgabe, ohne zunächst den gesamten String aufzubauen.
json_string = json.dumps(rows, indent=2)
with open("output.json", "w") as f:
f.write(json_string) # unnötiger Zwischen-Stringwith open("output.json", "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False) # direktes SchreibenProblem: csv.DictReader gibt alle Werte als Strings zurück. Die JSON-Ausgabe enthält "quantity": "5" statt "quantity": 5, was typsichere API-Verbraucher ablehnen.
Lösung: Numerische Spalten vor der Serialisierung explizit mit int() oder float() umwandeln.
rows = list(csv.DictReader(f))
json.dumps(rows)
# [{"port": "8080", "workers": "4"}] ← Strings, keine Zahlenrows = list(csv.DictReader(f))
for row in rows:
row["port"] = int(row["port"])
row["workers"] = int(row["workers"])
json.dumps(rows)
# [{"port": 8080, "workers": 4}] ← korrekte GanzzahlenProblem: Unter Windows ist die Standard-Kodierung cp1252. Nicht-ASCII-Zeichen (Umlaute, CJK-Text) werden stillschweigend korrumpiert oder lösen UnicodeDecodeError aus.
Lösung: Bei open() für CSV-Lesen und JSON-Schreiben immer encoding='utf-8' übergeben.
with open("locations.csv", "r") as f: # verwendet System-Standard-Kodierung
rows = list(csv.DictReader(f))with open("locations.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))Problem: str(mein_dict) erzeugt Python-Syntax (einfache Anführungszeichen, True, None), die kein gültiges JSON ist. APIs und JSON-Parser lehnen es ab.
Lösung: Immer json.dumps() verwenden, um gültiges JSON zu erzeugen. Es konvertiert True zu true, None zu null und verwendet doppelte Anführungszeichen.
output = str({"active": True, "note": None})
# "{'active': True, 'note': None}" ← KEIN gültiges JSONoutput = json.dumps({"active": True, "note": None})
# '{"active": true, "note": null}' ← gültiges JSONjson.dumps() vs. Alternativen — Schnellvergleich
Für die meisten CSV-zu-JSON-Konvertierungen ist die Kombination aus der Standardbibliothek csv + json die richtige Wahl: keine Abhängigkeiten, mit Python mitgeliefert, funktioniert überall. Zu orjson greifen, wenn Profiling zeigt, dass die Serialisierung ein Engpass ist — der Geschwindigkeitsunterschied ist bei großen Mengen real. pandas verwenden, wenn zusätzlich Datenbereinigung, Filterung oder Aggregation vor der JSON-Konvertierung benötigt wird. Für eine schnelle Konvertierung ohne Code erledigt der Online-CSV-zu-JSON-Konverter das sofort.
Häufig gestellte Fragen
Was ist der Unterschied zwischen json.dump() und json.dumps() in Python?
json.dump(obj, file) schreibt die JSON-Ausgabe direkt in ein dateiähnliches Objekt (alles mit einer .write()-Methode). json.dumps(obj) gibt einen JSON-formatierten String zurück. json.dump() verwenden, wenn in eine Datei geschrieben wird; json.dumps(), wenn das JSON als Python-String für Logging, die Einbettung in einen Payload oder das Senden über einen Socket benötigt wird. Beide akzeptieren dieselben Schlüsselwortargumente (indent, sort_keys, ensure_ascii, default).
Wie konvertiere ich ein Python-Dictionary in einen JSON-String?
json.dumps(dein_dict) aufrufen. Der Rückgabewert ist ein str mit gültigem JSON. indent=2 für lesbare Ausgabe hinzufügen. Wenn das Dictionary Nicht-ASCII-Werte enthält, ensure_ascii=False übergeben, um Zeichen wie Umlaute oder CJK-Text zu erhalten.
import json
server_config = {"host": "api.internal", "port": 8443, "debug": False}
json_string = json.dumps(server_config, indent=2)
print(json_string)
# {
# "host": "api.internal",
# "port": 8443,
# "debug": false
# }Wie speichere ich eine Python-Liste von Dicts als JSON-Datei?
Eine Datei im Schreibmodus mit UTF-8-Kodierung öffnen und dann json.dump(deine_liste, f, indent=2, ensure_ascii=False) aufrufen. Für die Dateiausgabe immer json.dump() (nicht json.dumps()) verwenden — es schreibt direkt in den Datei-Handle, ohne einen Zwischenstring im Arbeitsspeicher zu erzeugen.
import json
records = [
{"order_id": "ORD-4821", "total": 129.99, "currency": "USD"},
{"order_id": "ORD-4822", "total": 89.50, "currency": "EUR"},
]
with open("orders.json", "w", encoding="utf-8") as f:
json.dump(records, f, indent=2, ensure_ascii=False)Warum wandelt json.dumps() True in true und None in null um?
Python-Booleans (True, False) und None sind keine gültigen JSON-Token. Die JSON-Spezifikation verwendet Kleinbuchstaben true, false und null. json.dumps() übernimmt diese Zuordnung automatisch — True wird zu true, False zu false, None zu null. Eine manuelle Konvertierung ist nicht notwendig. Umgekehrt ordnet json.loads() diese Werte wieder Python-Typen zu.
Wie gehe ich mit datetime-Objekten beim Konvertieren von CSV-Daten in JSON um?
Eine default=-Funktion an json.dumps() übergeben, die datetime-Objekte in ISO-8601-Strings umwandelt. Die default-Funktion wird für jedes Objekt aufgerufen, das json nicht nativ serialisieren kann. obj.isoformat() für datetime-Instanzen zurückgeben und für alles andere TypeError auslösen.
import json
from datetime import datetime
def json_default(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Not serializable: {type(obj)}")
event = {"action": "login", "timestamp": datetime(2026, 3, 15, 9, 30, 0)}
print(json.dumps(event, default=json_default))
# {"action": "login", "timestamp": "2026-03-15T09:30:00"}Kann ich CSV ohne pandas in JSON konvertieren?
Ja. Die Python-Standardbibliothek enthält alles Notwendige. csv.DictReader verwenden, um jede Zeile als Dictionary einzulesen, die Zeilen in einer Liste sammeln und mit json.dump() oder json.dumps() serialisieren. Keine Drittanbieter-Bibliotheken erforderlich. pandas lohnt sich nur, wenn zusätzlich Datenbereinigung, Typinferenz benötigt wird oder es bereits anderweitig im Projekt eingesetzt wird.
import csv
import json
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)Für eine Einzel-Klick-Alternative ohne Python-Code den CSV-zu-JSON-Konverter ausprobieren — CSV-Daten einfügen und sofort formatierten JSON-Output erhalten.
Verwandte Tools
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.
Priya is a data scientist and machine learning engineer who has worked across the full Python data stack — from raw data ingestion and cleaning to model deployment and monitoring. She is passionate about reproducible research, Jupyter-based workflows, and the practical engineering side of ML. She writes about NumPy, Pandas, data serialisation, and the Python patterns that make data pipelines reliable at scale.