Konwersja CSV do JSON w Pythonie — Przewodnik json.dumps()
Użyj darmowego CSV do JSON bezpośrednio w przeglądarce — bez instalacji.
Wypróbuj CSV do JSON online →Pliki CSV pojawiają się wszędzie — eksportowane raporty, zrzuty baz danych, wyciągi z logów — i prędzej czy później trzeba przekonwertować taki plik CSV do JSON w Pythonie. Biblioteka standardowa obsługuje to za pomocą dwóch modułów: csv.DictReader zamienia każdy wiersz w słownik Pythona, a json.dumps() serializuje te słowniki do ciągu JSON. Jeśli potrzebujesz jednorazowej konwersji bez pisania kodu, konwerter CSV do JSON robi to natychmiast w przeglądarce. Ten przewodnik obejmuje pełną ścieżkę programową: json.dump() vs json.dumps(), zapis JSON do pliku, serializację dataclass, rzutowanie typów dla wartości CSV, obsługę datetime i Decimal oraz wydajne alternatywy takie jak orjson. Wszystkie przykłady wymagają Python 3.10+.
- ✓csv.DictReader zwraca listę słowników — serializuj całą listę przez json.dump(rows, f, indent=2), aby zapisać plik JSON.
- ✓json.dump() zapisuje bezpośrednio do obiektu pliku. json.dumps() zwraca ciąg znaków. Wybierz właściwą funkcję i unikniesz zbędnego kopiowania danych.
- ✓Wartości CSV są zawsze ciągami znaków. Rzutuj kolumny liczbowe jawnie (int(), float()) przed serializacją do JSON.
- ✓Przekaż ensure_ascii=False do json.dumps(), aby zachować znaki Unicode — litery z akcentami, tekst CJK — w wyjściu.
- ✓Dla datetime, UUID lub Decimal z CSV użyj parametru default= z własną funkcją zastępczą.
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") w surowym wyjściu. CSV nie posiada systemu typów — każda wartość jest ciągiem znaków. Jak to naprawić, opisano w sekcji dotyczącej rzutowania typów poniżej.json.dumps() — Serializacja słownika Pythona do ciągu JSON
Moduł json jest dostarczany z każdą instalacją Pythona — żaden pip install nie jest potrzebny. json.dumps(obj) przyjmuje obiekt Pythona (dict, list, ciąg znaków, liczbę, bool lub None) i zwraca str zawierający poprawny JSON. Słownik Pythona wygląda podobnie do obiektu JSON, ale są to zasadniczo różne rzeczy: dict to struktura danych Pythona w pamięci, a ciąg JSON to serializowany tekst. Wywołanie json.dumps() wypełnia tę lukę.
Minimalny przykład — jeden wiersz CSV do JSON
import json
# Pojedynczy wiersz CSV reprezentowany jako słownik Pythona
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
# Konwersja słownika do ciągu JSON
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'>Otrzymujemy zwarte, jednowierszowe JSON — dobre dla ładunków i przechowywania, fatalne do czytania. Dodaj indent=2 aby uzyskać czytelne wyjście:
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"
# }Jeszcze dwa parametry, których używam przy prawie każdym wywołaniu: sort_keys=True porządkuje klucze słownika alfabetycznie (przydatne przy porównywaniu plików JSON między wersjami), a ensure_ascii=False zachowuje znaki spoza ASCII zamiast zamieniać je na sekwencje \uXXXX.
import json
warehouse_record = {
"sku": "WH-9031",
"location": "Magazyn Warszawa 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": "Magazyn Warszawa 3",
# "quantity": 240,
# "sku": "WH-9031"
# }Krótka uwaga o parametrze separators: domyślna wartość to (", ", ": "), która dodaje spacje po przecinkach i dwukropkach. Dla najbardziej zwartego wyjścia (przydatne przy osadzaniu JSON w parametrach URL lub zmniejszaniu rozmiaru odpowiedzi API), przekaż separators=(",", ":").
json.dumps() konwertuje True Pythona na true JSON, None na null i opakowuje ciągi znaków w podwójne cudzysłowy (Python dopuszcza pojedyncze cudzysłowy, JSON nie). Zawsze używaj json.dumps() do tworzenia poprawnego JSON — nie polegaj na str() ani repr().csv.DictReader do pliku JSON — kompletny potok
Najczęstszym zadaniem w praktyce jest odczytanie całego pliku CSV i zapisanie go jako JSON. Oto kompletny skrypt w mniej niż 10 wierszach. csv.DictReader zwraca iterator obiektów dict — po jednym na wiersz, używając pierwszej linii jako kluczy. Opakowanie go w list() zbiera wszystkie wiersze do listy Pythona, która serializuje się do tablicy JSON.
import csv
import json
# Krok 1: Odczytaj wiersze CSV do listy słowników
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
# Krok 2: Zapisz listę jako plik JSON
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)
print(f"Przekonwertowano {len(rows)} wierszy do inventory.json")Dwa wywołania open(): jedno do odczytu CSV, drugie do zapisu JSON. To cały wzorzec. Zauważ, że używamy tutaj json.dump() (bez s) — zapisuje bezpośrednio do uchwytu pliku. Użycie json.dumps() zwróciłoby ciąg znaków, który następnie trzeba by zapisać oddzielnie przez f.write(). json.dump() jest bardziej efektywny pamięciowo, ponieważ strumieniuje wyjście zamiast budować cały ciąg znaków w pamięci przed zapisem.
Gdy potrzebujesz JSON jako ciągu znaków zamiast pliku — do osadzenia w ładunku API, wypisania na standardowe wyjście lub wstawienia do kolumny bazy danych — przełącz się na json.dumps():
import csv
import json
with open("sensors.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# Pobierz JSON jako ciąg znaków zamiast zapisywać do pliku
json_payload = json.dumps(rows, indent=2)
print(json_payload)
# [
# {
# "sensor_id": "TMP-4401",
# "location": "Budynek 7 - Piętro 2",
# "reading": "22.4",
# "unit": "celsius"
# },
# ...
# ]Jeden wiersz vs. pełny zbiór danych: jeśli wywołasz json.dumps(pojedynczy_dict), otrzymasz obiekt JSON ({...}). Wywołaj json.dumps(lista_słowników) i otrzymasz tablicę JSON ([{...}, {...}]). Kształt zewnętrznego kontenera zależy od tego, co przekażesz. Większość systemów docelowych oczekuje tablicy dla danych tabelarycznych.
Obsługa wartości nieliczbowych — rzutowanie typów z CSV
Oto pułapka, na którą każdy natyka się za pierwszym razem: csv.DictReader zwraca każdą wartość jako ciąg znaków. Liczba 42 w pliku CSV staje się ciągiem "42" w słowniku. Jeśli serializujesz to bezpośrednio przez json.dumps(), JSON będzie zawierał "quantity": "42" zamiast "quantity": 42. API weryfikujące typy odrzucą taki wynik. Musisz jawnie rzutować wartości.
import csv
import json
def coerce_types(row: dict) -> dict:
"""Konwertuje wartości ciągów znaków na odpowiednie typy Pythona."""
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": "Budynek 7 - Piętro 2",
# "temperature": 22.4,
# "humidity": 58.3,
# "battery_pct": 87,
# "active": true
# }Teraz temperature jest liczbą zmiennoprzecinkową, battery_pct jest liczbą całkowitą, a active jest wartością logiczną w wyjściu JSON. Funkcja rzutowania jest specyficzna dla schematu CSV — nie ma ogólnego sposobu na odgadnięcie typów z danych CSV, dlatego piszę jedną funkcję na każdy format CSV.
Serializacja niestandardowych obiektów i niestandardowych typów
Moduł json Pythona nie potrafi domyślnie serializować datetime, UUID, Decimalani klas niestandardowych. Wywołanie json.dumps() na którymkolwiek z tych typów zgłosi TypeError. Są dwa sposoby na obsługę tego.
Podejście 1: Parametr default=
Przekaż funkcję do default=, która konwertuje nieznane typy na coś serializowalnego. Funkcja ta jest wywoływana tylko dla obiektów, których koder JSON nie potrafi obsłużyć.
import json
from datetime import datetime
from decimal import Decimal
from uuid import UUID
def json_serial(obj):
"""Zastępcza serializacja dla niestandardowych typów."""
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"
# }TypeError na końcu funkcji default= dla nierozpoznanych typów. Jeśli zwrócisz None lub po cichu je pominiesz, w wyjściu pojawi się null bez żadnego sygnału, że dane zostały utracone.Podejście 2: Dataclasses z asdict()
Dataclassy Pythona nadają wierszom CSV właściwą definicję typów. Użyj dataclasses.asdict() do konwersji instancji dataclass na zwykły słownik, a następnie przekaż go do json.dumps().
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="Gdańsk",
destination="Warszawa",
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": "Gdańsk",
# "destination": "Warszawa",
# "weight_kg": 1240.5,
# "shipped_at": "2026-03-12T08:00:00"
# }asdict() rekurencyjnie konwertuje zagnieżdżone dataclassy na słowniki. Jeśli dataclass zawiera listę innych dataclassów, całe drzewo zostaje przekonwertowane — bez dodatkowego kodu.Dokumentacja parametrów json.dumps()
Pełna lista argumentów słownikowych przyjmowanych przez json.dumps() i json.dump(). Obie funkcje przyjmują identyczne parametry — json.dump() przyjmuje dodatkowy pierwszy argument dla obiektu pliku.
csv.DictReader — Odczyt CSV do słowników Pythona
csv.DictReader to druga połowa potoku CSV-do-JSON. Opakowuje obiekt pliku i zwraca po jednym dict na wiersz, używając pierwszej linii jako nazw pól. W porównaniu do csv.reader (który zwraca zwykłe listy), DictReader daje nazwany dostęp do kolumn — bez magicznych indeksów jak row[3].
import csv
import json
# Plik z separatorem tabulacji z eksportu bazy danych
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 odczytuje cały plik leniwie — zwraca wiersze jeden po drugim. Wywołanie list(reader) wczytuje wszystkie wiersze do pamięci. Dla plików z milionami wierszy przetwarzaj je strumieniowo zamiast wczytywać wszystkie naraz.Konwersja CSV z pliku i odpowiedzi API
Dwa scenariusze produkcyjne: odczyt pliku CSV z dysku i jego konwersja, oraz pobranie danych CSV z punktu końcowego API (wiele serwisów raportowania zwraca CSV). Oba wymagają odpowiedniej obsługi błędów.
Odczyt pliku CSV → Konwersja → Zapis JSON
import csv
import json
import sys
def csv_to_json_file(csv_path: str, json_path: str) -> int:
"""Konwertuje plik CSV do JSON. Zwraca liczbę zapisanych wierszy."""
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")Pobierz CSV z API → Przetwórz → JSON
import csv
import io
import json
import urllib.request
def fetch_csv_as_json(url: str) -> str:
"""Pobiera CSV z URL i zwraca go jako ciąg JSON."""
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)
# Przykład: punkt końcowy eksportu zwracający CSV
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}")Oba przykłady używają jawnego encoding="utf-8" przy każdym otwieraniu pliku. Ma to znaczenie dla plików CSV ze znakami spoza ASCII — imionami z akcentami, adresami ze znakami specjalnymi, tekstem CJK. Bez jawnego kodowania Python używa domyślnego systemowego, które w systemie Windows to często cp1252 i po cichu psuje znaki wielobajtowe.
Weryfikacja wyjścia JSON z json.loads()
Po konwersji CSV do ciągu JSON możesz zweryfikować wynik, parsując go z powrotem przez json.loads(). Ten cykl weryfikacji wykrywa problemy z kodowaniem, uszkodzone sekwencje ucieczki lub przypadkowe łączenie ciągów, które dałoby niepoprawny JSON. Opakuj wywołanie w blok try/except.
import json
json_string = json.dumps({"order_id": "ORD-7291", "total": 129.99})
# Zweryfikuj poprawność JSON, parsując go z powrotem
try:
parsed = json.loads(json_string)
print(f"Poprawny JSON z {len(parsed)} kluczami")
except json.JSONDecodeError as e:
print(f"Niepoprawny JSON: {e}")
# Poprawny JSON z 2 kluczamiKonwersja CSV do JSON z wiersza poleceń
Szybkie konwersje z terminala — bez pliku skryptu. Flaga -c Pythona uruchamia kod w miejscu, a wynik można przesłać przez potok do python3 -m json.tool w celu sformatowania.
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 to wbudowany formater JSON. Czyta JSON ze standardowego wejścia, waliduje go i wypisuje z wcięciem 4 spacji. Przydatny do sprawdzenia, czy konwersja CSV-do-JSON dała poprawne wyjście. Jeśli wolisz wcięcie 2 spacji lub potrzebujesz filtrowania, użyj zamiast tego jq.Wydajna alternatywa — orjson
Wbudowany moduł json sprawdza się dobrze w przypadku większości plików CSV. Ale jeśli przetwarzasz zestawy danych z dziesiątkami tysięcy wierszy w pętli lub Twoje API musi serializować dane z CSV przy każdym żądaniu, orjson jest 5–10x szybszy. Napisany w Rust, zwraca bytes zamiast str i natywnie serializuje datetime, UUID i tablice numpy bez niestandardowej funkcji default=.
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() zwraca bytes, nie str
json_bytes = orjson.dumps(rows, option=orjson.OPT_INDENT_2)
with open("telemetry_events.json", "wb") as f: # uwaga: "wb" dla bytes
f.write(json_bytes)
print(f"Zapisano {len(rows)} zdarzeń ({len(json_bytes)} bajtów)")API jest nieco inne: orjson.dumps() zwraca bytes i używa flag option= zamiast argumentów słownikowych. Otwieraj pliki w binarnym trybie zapisu ("wb") przy zapisie wyjścia orjson. Jeśli potrzebujesz ciągu znaków, wywołaj .decode("utf-8") na wyniku.
Podświetlanie składni w terminalu — rich
Debugowanie konwersji CSV-do-JSON w terminalu jest łatwiejsze z kolorowym wyjściem. Biblioteka rich renderuje JSON z podświetlaniem składni — klucze, ciągi znaków, liczby i wartości logiczne otrzymują własne kolory.
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 dodaje kody ucieczki ANSI do wyjścia. Nie zapisuj wyjścia sformatowanego przez rich do pliku ani odpowiedzi API — będzie zawierało niewidoczne znaki sterujące. Używaj rich wyłącznie do wyświetlania w terminalu.Praca z dużymi plikami CSV
Wczytanie 500 MB pliku CSV przez list(csv.DictReader(f)) przydziela cały zbiór danych w pamięci, a następnie json.dump() buduje pełny ciąg JSON na tej samej pamięci. Dla plików większych niż 50–100 MB przejdź na podejście strumieniowe lub zapisuj NDJSON (newline-delimited JSON) — jeden obiekt JSON na wiersz.
NDJSON — jeden obiekt JSON na wiersz
import csv
import json
def csv_to_ndjson(csv_path: str, ndjson_path: str) -> int:
"""Konwertuje CSV do NDJSON, przetwarzając jeden wiersz na raz."""
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"Zapisano {rows_written} linii do access_log.ndjson")
# Każda linia to samodzielny obiekt JSON:
# {"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"}Strumieniowanie z ijson dla dużych plików JSON
import ijson # pip install ijson
def count_high_value_orders(json_path: str, threshold: float) -> int:
"""Liczy zamówienia powyżej progu bez wczytywania całego pliku."""
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
# Przetworzenie 2 GB pliku JSON przy stałym zużyciu pamięci
high_value = count_high_value_orders("all_orders.json", 500.0)
print(f"Znaleziono {high_value} zamówień powyżej 500 zł")ijson służy do odczytu dużych plików JSON — po stronie zapisu wzorzec NDJSON powyżej utrzymuje stałe zużycie pamięci niezależnie od rozmiaru pliku.Częste błędy
Problem: json.dumps() zwraca ciąg znaków. Zapisanie go przez f.write() działa, ale tworzy niepotrzebny pośredni ciąg znaków w pamięci — marnotrawny przy dużych zbiorach danych.
Rozwiązanie: Użyj json.dump(data, f), aby zapisywać bezpośrednio do obiektu pliku. Strumieniuje wyjście bez uprzedniego budowania pełnego ciągu znaków.
json_string = json.dumps(rows, indent=2)
with open("output.json", "w") as f:
f.write(json_string) # unnecessary intermediate stringwith open("output.json", "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False) # direct writeProblem: csv.DictReader zwraca wszystkie wartości jako ciągi znaków. Wyjście JSON zawiera "quantity": "5" zamiast "quantity": 5, co psuje typowane interfejsy API.
Rozwiązanie: Rzutuj kolumny liczbowe jawnie za pomocą int() lub float() przed serializacją.
rows = list(csv.DictReader(f))
json.dumps(rows)
# [{"port": "8080", "workers": "4"}] ← strings, not numbersrows = 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}] ← proper integersProblem: W systemie Windows domyślne kodowanie to cp1252. Znaki spoza ASCII (imiona z akcentami, tekst CJK) zostają po cichu zniekształcone lub zgłaszają UnicodeDecodeError.
Rozwiązanie: Zawsze przekazuj encoding='utf-8' do open() zarówno przy odczycie CSV, jak i zapisie JSON.
with open("locations.csv", "r") as f: # uses system default encoding
rows = list(csv.DictReader(f))with open("locations.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))Problem: str(my_dict) produkuje składnię Pythona (pojedyncze cudzysłowy, True, None), która nie jest poprawnym JSON. API i parsery JSON ją odrzucają.
Rozwiązanie: Zawsze używaj json.dumps() do tworzenia poprawnego JSON. Konwertuje True na true, None na null i używa podwójnych cudzysłowów.
output = str({"active": True, "note": None})
# "{'active': True, 'note': None}" ← NOT valid JSONoutput = json.dumps({"active": True, "note": None})
# '{"active": true, "note": null}' ← valid JSONjson.dumps() vs alternatywy — szybkie porównanie
W przypadku większości konwersji CSV-do-JSON kombinacja csv + json ze standardowej biblioteki to właściwy wybór: zero zależności, dostarczona z Pythonem, działa wszędzie. Sięgaj po orjson, gdy profilowanie wykazuje, że serializacja jest wąskim gardłem — różnica szybkości jest realna przy dużej skali. Używaj pandas, gdy potrzebujesz również czyszczenia, filtrowania lub agregacji danych przed konwersją do JSON. Jeśli potrzebujesz szybkiej konwersji bez pisania kodu, konwerter CSV do JSON online robi to natychmiast.
Często zadawane pytania
Jaka jest różnica między json.dump() a json.dumps() w Pythonie?
json.dump(obj, plik) zapisuje wyjście JSON bezpośrednio do obiektu plikopodobnego (dowolnego obiektu z metodą .write()). json.dumps(obj) zwraca ciąg znaków sformatowany jako JSON. Używaj json.dump() przy zapisie do pliku, a json.dumps() gdy potrzebujesz JSON jako ciągu znaków Pythona — do logowania, osadzenia w ładunku lub przesłania przez gniazdo sieciowe. Obie funkcje przyjmują te same argumenty słownikowe (indent, sort_keys, ensure_ascii, default).
Jak przekonwertować słownik Pythona na ciąg JSON?
Wywołaj json.dumps(twój_słownik). Wartość zwracana to str zawierający poprawny JSON. Dodaj indent=2 dla czytelnego wyjścia. Jeśli słownik zawiera wartości spoza ASCII, przekaż ensure_ascii=False, aby zachować znaki takie jak litery z akcentami czy tekst CJK.
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
# }Jak zapisać listę słowników Pythona jako plik JSON?
Otwórz plik do zapisu z kodowaniem UTF-8, a następnie wywołaj json.dump(twoja_lista, f, indent=2, ensure_ascii=False). Zawsze używaj json.dump() (nie json.dumps()) do zapisu do pliku — zapisuje bezpośrednio do uchwytu pliku bez tworzenia pośredniego ciągu znaków w pamięci.
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)Dlaczego json.dumps() zamienia True na true, a None na null?
Wartości logiczne Pythona (True, False) i None nie są poprawnymi tokenami JSON. Specyfikacja JSON używa małych liter: true, false i null. json.dumps() wykonuje to mapowanie automatycznie — True staje się true, False staje się false, a None staje się null. Nie trzeba tych wartości konwertować ręcznie. W odwrotnym kierunku json.loads() mapuje je z powrotem na typy Pythona.
Jak obsługiwać obiekty datetime przy konwersji danych CSV do JSON?
Przekaż funkcję do parametru default= w json.dumps(), która konwertuje obiekty datetime na ciągi ISO 8601. Funkcja default jest wywoływana dla każdego obiektu, którego json nie potrafi serializować natywnie. Zwróć obj.isoformat() dla instancji datetime i zgłoś TypeError dla pozostałych.
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"}Czy można konwertować CSV do JSON bez pandas?
Tak. Biblioteka standardowa Pythona zawiera wszystko, czego potrzebujesz. Użyj csv.DictReader do odczytu każdego wiersza jako słownik, zbierz wiersze do listy i serializuj za pomocą json.dump() lub json.dumps(). Żadne biblioteki zewnętrzne nie są wymagane. pandas warto dodać tylko wtedy, gdy potrzebujesz również czyszczenia danych, wnioskowania o typach lub używasz go już w innym miejscu projektu.
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)Dla szybkiej alternatywy bez pisania kodu w Pythonie, wypróbuj konwerter CSV do JSON — wklej dane CSV i natychmiast otrzymaj sformatowane wyjście JSON.
Powiązane narzędzia
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.