Convertir CSV en JSON avec Python — Guide json.dumps()
Utilisez le CSV vers JSON gratuit directement dans votre navigateur — sans installation.
Essayer CSV vers JSON en ligne →Les fichiers CSV sont omniprésents — rapports exportés, dumps de base de données, extraits de logs — et tôt ou tard vous devez convertir ce CSV en JSON avec Python. La bibliothèque standard gère cela avec deux modules : csv.DictReader transforme chaque ligne en dict Python, et json.dumps() sérialise ces dicts en chaîne JSON. Pour une conversion rapide sans code, le convertisseur CSV vers JSON le fait instantanément dans le navigateur. Ce guide couvre le parcours complet par programmation : json.dump() vs json.dumps(), l'écriture de JSON dans des fichiers, la sérialisation de dataclasses, la coercition de types pour les valeurs CSV, la gestion de datetime et Decimal, et les alternatives haute performance comme orjson. Tous les exemples ciblent Python 3.10+.
- ✓csv.DictReader produit une liste de dicts — sérialisez la liste complète avec json.dump(rows, f, indent=2) pour écrire un fichier JSON.
- ✓json.dump() écrit directement dans un objet fichier. json.dumps() retourne une chaîne. Choisissez le bon et vous évitez une copie inutile.
- ✓Les valeurs CSV sont toujours des chaînes. Convertissez explicitement les colonnes numériques (int(), float()) avant de sérialiser en JSON.
- ✓Passez ensure_ascii=False à json.dumps() pour conserver les caractères Unicode — noms accentués, texte CJK — dans la sortie.
- ✓Pour datetime, UUID ou Decimal issus d'un CSV, utilisez le paramètre default= avec une fonction de secours personnalisée.
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") dans la sortie brute. CSV ne possède pas de système de types — chaque valeur est une chaîne. La correction de cela est traitée dans la section de coercition de types ci-dessous.json.dumps() — Sérialiser un dict Python en chaîne JSON
Le module json est livré avec chaque installation Python — aucun pip install requis. json.dumps(obj) prend un objet Python (dict, list, string, nombre, bool ou None) et retourne une str contenant du JSON valide. Un dictionnaire Python ressemble à un objet JSON, mais ils sont fondamentalement différents : un dict est une structure de données Python en mémoire, et une chaîne JSON est du texte sérialisé. Appeler json.dumps() comble ce fossé.
Exemple minimal — Une ligne CSV vers JSON
import json
# Une seule ligne CSV représentée comme un dict Python
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
# Convertir le dict en chaîne 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'>Cela produit du JSON compact sur une ligne — idéal pour les payloads et le stockage, mais difficile à lire. Ajoutez indent=2 pour obtenir une sortie lisible :
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"
# }Deux autres paramètres que j'utilise sur presque chaque appel : sort_keys=True trie les clés du dictionnaire par ordre alphabétique (pratique pour comparer les fichiers JSON entre versions), et ensure_ascii=False conserve les caractères non-ASCII au lieu de les échapper en séquences \uXXXX.
import json
warehouse_record = {
"sku": "WH-9031",
"location": "Entrepôt Lyon 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": "Entrepôt Lyon 3",
# "quantity": 240,
# "sku": "WH-9031"
# }Note rapide sur le paramètre separators : la valeur par défaut est (", ", ": ") qui ajoute des espaces après les virgules et les deux-points. Pour la sortie la plus compacte possible (utile pour intégrer du JSON dans des paramètres URL ou réduire les octets des réponses API), passez separators=(",", ":").
json.dumps() convertit le True Python en true JSON, None en null, et entoure les chaînes de guillemets doubles (Python autorise les guillemets simples, JSON non). Utilisez toujours json.dumps() pour produire du JSON valide — ne vous fiez pas à str() ou repr().csv.DictReader vers fichier JSON — Le pipeline complet
La tâche la plus courante en production est de lire un fichier CSV entier et de le sauvegarder en JSON. Voici le script de bout en bout en moins de 10 lignes. csv.DictReader produit un itérateur d'objets dict — un par ligne, en utilisant la première ligne comme clés. L'envelopper dans list() collecte toutes les lignes dans une liste Python, qui se sérialise en tableau JSON.
import csv
import json
# Étape 1 : Lire les lignes CSV dans une liste de dicts
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
# Étape 2 : Écrire la liste dans un fichier JSON
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")Deux appels à open() : un pour lire le CSV, un pour écrire le JSON. C'est tout le modèle. Remarquez l'utilisation de json.dump() (sans le s) — il écrit directement dans le descripteur de fichier. Utiliser json.dumps() retournerait une chaîne que vous devriez ensuite écrire séparément avec f.write(). json.dump() est plus efficace en mémoire car il diffuse la sortie au lieu de construire la chaîne entière en mémoire d'abord.
Quand vous avez besoin du JSON sous forme de chaîne plutôt que dans un fichier — pour l'incorporer dans un payload API, l'afficher dans stdout, ou l'insérer dans une colonne de base de données — utilisez json.dumps() :
import csv
import json
with open("sensors.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# Obtenir le JSON sous forme de chaîne plutôt que de l'écrire dans un fichier
json_payload = json.dumps(rows, indent=2)
print(json_payload)
# [
# {
# "sensor_id": "TMP-4401",
# "location": "Bâtiment 7 - Étage 2",
# "reading": "22.4",
# "unit": "celsius"
# },
# ...
# ]Ligne unique vs. jeu de données complet : si vous appelez json.dumps(single_dict) vous obtenez un objet JSON ({...}). Appelez json.dumps(list_of_dicts) et vous obtenez un tableau JSON ([{...}, {...}]). La forme du conteneur externe dépend de ce que vous passez. La plupart des consommateurs en aval attendent un tableau pour des données tabulaires.
Gestion des valeurs non-chaîne — Coercition de types depuis CSV
Voici ce qui piège tout le monde la première fois : csv.DictReader retourne chaque valeur sous forme de chaîne. Le nombre 42 dans votre CSV devient la chaîne "42" dans le dict. Si vous sérialisez cela directement avec json.dumps(), votre JSON contiendra "quantity": "42" au lieu de "quantity": 42. Les API qui valident les types rejetteront cela. Vous devez convertir les valeurs explicitement.
import csv
import json
def coerce_types(row: dict) -> dict:
"""Convert string values to appropriate Python types."""
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": "Bâtiment 7 - Étage 2",
# "temperature": 22.4,
# "humidity": 58.3,
# "battery_pct": 87,
# "active": true
# }Maintenant temperature est un float, battery_pct est un entier, et activeest un booléen dans la sortie JSON. La fonction de coercition est spécifique à votre schéma CSV — il n'existe pas de façon générique de deviner les types depuis des données CSV, donc j'écris une fonction par format CSV.
Sérialisation d'objets personnalisés et de types non standard
Le module json de Python ne peut pas sérialiser datetime, UUID, Decimal, ni des classes personnalisées par défaut. Appeler json.dumps() sur l'un d'eux lève une TypeError. Deux approches permettent de gérer cela.
Approche 1 : Le paramètre default=
Passez une fonction à default= qui convertit les types inconnus en quelque chose de sérialisable. Cette fonction n'est appelée que pour les objets que l'encodeur JSON ne sait pas gérer.
import json
from datetime import datetime
from decimal import Decimal
from uuid import UUID
def json_serial(obj):
"""Fallback serializer for non-standard types."""
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 à la fin de votre fonction default= pour les types non reconnus. Si vous retournez None ou les ignorez silencieusement, vous obtenez null dans la sortie sans aucune indication que des données ont été perdues.Approche 2 : Les dataclasses avec asdict()
Les dataclasses Python donnent à vos lignes CSV une définition de type appropriée. Utilisez dataclasses.asdict() pour convertir une instance de dataclass en dict simple, puis passez-le à 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="Marseille",
destination="Paris",
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": "Marseille",
# "destination": "Paris",
# "weight_kg": 1240.5,
# "shipped_at": "2026-03-12T08:00:00"
# }asdict()convertit récursivement les dataclasses imbriquées en dicts. Si votre dataclass contient une liste d'autres dataclasses, tout l'arbre est converti — aucun code supplémentaire nécessaire.Référence des paramètres de json.dumps()
Liste complète des arguments nommés acceptés par json.dumps() et json.dump(). Les deux fonctions acceptent des paramètres identiques — json.dump() prend un argument supplémentaire pour l'objet fichier.
csv.DictReader — Lire un CSV en dicts Python
csv.DictReader est l'autre moitié du pipeline CSV vers JSON. Il enveloppe un objet fichier et produit un dict par ligne, en utilisant la première ligne comme noms de champs. Comparé à csv.reader (qui produit des listes simples), DictReader vous donne un accès nommé aux colonnes — sans index obscurs comme row[3].
import csv
import json
# Fichier séparé par tabulations depuis un export de base de données
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 lit le fichier entier de façon paresseuse — il produit les lignes une par une. Appeler list(reader) charge toutes les lignes en mémoire. Pour les fichiers avec des millions de lignes, traitez-les en mode streaming plutôt que de tout collecter.Convertir du CSV depuis un fichier et une réponse API
Deux scénarios de production : lire un fichier CSV depuis le disque et le convertir, et récupérer des données CSV depuis un endpoint API (de nombreux services de reporting retournent du CSV). Les deux nécessitent une gestion d'erreurs appropriée.
Lire un fichier CSV → Convertir → Écrire JSON
import csv
import json
import sys
def csv_to_json_file(csv_path: str, json_path: str) -> int:
"""Convert a CSV file to JSON. Returns the number of rows written."""
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")Récupérer du CSV depuis une API → Parser → JSON
import csv
import io
import json
import urllib.request
def fetch_csv_as_json(url: str) -> str:
"""Fetch CSV from a URL and return it as a JSON string."""
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)
# Exemple : endpoint d'export qui retourne du 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}")Les deux exemples utilisent encoding="utf-8" explicitement sur chaque ouverture de fichier. C'est important pour les fichiers CSV contenant des caractères non-ASCII — noms accentués, adresses avec des caractères spéciaux, texte CJK. Sans encodage explicite, Python revient au défaut système, qui sur Windows est souvent cp1252 et altère silencieusement les caractères multi-octets.
Vérifier la sortie JSON avec json.loads()
Après avoir converti du CSV en chaîne JSON, vous pouvez vérifier le résultat en le réanalysant avec json.loads(). Ce test aller-retour détecte les problèmes d'encodage, les séquences d'échappement cassées ou la concaténation accidentelle de chaînes qui produirait du JSON invalide. Enveloppez l'appel dans un bloc try/except.
import json
json_string = json.dumps({"order_id": "ORD-7291", "total": 129.99})
# Vérifier que c'est du JSON valide en le réanalysant
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 keysConversion CSV vers JSON en ligne de commande
Conversions rapides depuis le terminal — aucun fichier script nécessaire. L'option -c de Python exécute du code inline, et vous pouvez rediriger le résultat vers python3 -m json.tool pour un affichage indenté.
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.toolest le formateur JSON intégré. Il lit du JSON depuis stdin, le valide, et l'affiche avec une indentation de 4 espaces. Utile pour vérifier que votre conversion CSV vers JSON a produit une sortie valide. Si vous préférez une indentation à 2 espaces ou avez besoin de filtrage, utilisez jq à la place.Alternative haute performance — orjson
Le module json intégré convient très bien pour la plupart des fichiers CSV. Mais si vous traitez des jeux de données de dizaines de milliers de lignes dans une boucle, ou si votre API doit sérialiser des données issues de CSV à chaque requête, orjson est 5–10x plus rapide. Il est écrit en Rust, retourne des bytes au lieu d'une str, et sérialise nativement datetime, UUID et les tableaux numpy sans fonction default= personnalisée.
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() retourne des bytes, pas une str
json_bytes = orjson.dumps(rows, option=orjson.OPT_INDENT_2)
with open("telemetry_events.json", "wb") as f: # note: "wb" pour les bytes
f.write(json_bytes)
print(f"Wrote {len(rows)} events ({len(json_bytes)} bytes)")L'API est légèrement différente : orjson.dumps() retourne des bytes et utilise des drapeaux option= au lieu d'arguments nommés. Ouvrez les fichiers en mode écriture binaire ("wb") lors de l'écriture d'une sortie orjson. Si vous avez besoin d'une chaîne, appelez .decode("utf-8") sur le résultat.
Sortie terminal avec coloration syntaxique — rich
Le débogage des conversions CSV vers JSON dans le terminal est facilité par une sortie colorée. La bibliothèque rich affiche le JSON avec coloration syntaxique — les clés, chaînes, nombres et booléens ont chacun leur propre couleur.
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)richajoute des codes d'échappement ANSI à la sortie. N'écrivez pas une sortie formatée par rich dans un fichier ou une réponse API — elle contiendra des caractères de contrôle invisibles. Utilisez rich uniquement pour l'affichage dans le terminal.Travailler avec de gros fichiers CSV
Charger un fichier CSV de 500 Mo avec list(csv.DictReader(f)) alloue tout le jeu de données en mémoire, puis json.dump() construit la chaîne JSON complète par-dessus. Pour les fichiers de plus de 50–100 Mo, passez à une approche en streaming ou écrivez du NDJSON (JSON délimité par des sauts de ligne) — un objet JSON par ligne.
NDJSON — Un objet JSON par ligne
import csv
import json
def csv_to_ndjson(csv_path: str, ndjson_path: str) -> int:
"""Convert CSV to NDJSON, processing one row at a time."""
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")
# Chaque ligne est un objet JSON autonome :
# {"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 avec ijson pour les grandes entrées JSON
import ijson # pip install ijson
def count_high_value_orders(json_path: str, threshold: float) -> int:
"""Count orders above a threshold without loading the full file."""
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
# Traiter un fichier JSON de 2 Go avec une utilisation mémoire constante
high_value = count_high_value_orders("all_orders.json", 500.0)
print(f"Found {high_value} orders above $500")ijsonest destiné à la lecture de gros fichiers JSON — pour l'écriture, le modèle NDJSON ci-dessus maintient une utilisation mémoire constante quelle que soit la taille du fichier.Erreurs fréquentes
Problème : json.dumps() retourne une chaîne. L'écrire avec f.write() fonctionne, mais crée une chaîne intermédiaire inutile en mémoire — gaspilleur pour les gros jeux de données.
Correction : Utilisez json.dump(data, f) pour écrire directement dans l'objet fichier. Il diffuse la sortie sans construire la chaîne complète en premier.
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 writeProblème : csv.DictReader retourne toutes les valeurs sous forme de chaînes. La sortie JSON contient "quantity": "5" au lieu de "quantity": 5, ce qui brise les consommateurs API à types stricts.
Correction : Convertissez explicitement les colonnes numériques avec int() ou float() avant de sérialiser.
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 integersProblème : Sur Windows, l'encodage par défaut est cp1252. Les caractères non-ASCII (noms accentués, texte CJK) sont silencieusement altérés ou lèvent UnicodeDecodeError.
Correction : Passez toujours encoding='utf-8' à open() pour la lecture CSV et l'écriture 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))Problème : str(my_dict) produit de la syntaxe Python (guillemets simples, True, None) qui n'est pas du JSON valide. Les API et les parseurs JSON le rejettent.
Correction : Utilisez toujours json.dumps() pour produire du JSON valide. Il convertit True en true, None en null, et utilise des guillemets doubles.
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 Alternatives — Comparaison rapide
Pour la plupart des conversions CSV vers JSON, la combinaison csv + json de la bibliothèque standard est le bon choix : zéro dépendance, fourni avec Python, fonctionne partout. Optez pour orjson quand le profilage montre que la sérialisation est un goulot d'étranglement — la différence de vitesse est réelle à grande échelle. Utilisez pandas quand vous avez également besoin de nettoyage de données, de filtrage ou d'agrégation avant la conversion en JSON. Si vous avez juste besoin d'une conversion rapide sans écrire de code, le convertisseur CSV vers JSON en ligne le fait instantanément.
Questions fréquentes
Quelle est la différence entre json.dump() et json.dumps() en Python ?
json.dump(obj, file) écrit la sortie JSON directement dans un objet fichier (tout ce qui possède une méthode .write()). json.dumps(obj) retourne une chaîne formatée en JSON. Utilisez json.dump() pour écrire dans un fichier, json.dumps() lorsque vous avez besoin du JSON sous forme de chaîne Python pour les logs, l'incorporation dans un payload ou l'envoi via un socket. Les deux acceptent les mêmes arguments nommés (indent, sort_keys, ensure_ascii, default).
Comment convertir un dictionnaire Python en chaîne JSON ?
Appelez json.dumps(votre_dict). La valeur retournée est une str contenant du JSON valide. Ajoutez indent=2 pour un affichage lisible. Si votre dict contient des valeurs non-ASCII, passez ensure_ascii=False pour conserver les caractères accentués ou les textes en 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
# }Comment enregistrer une liste de dicts Python dans un fichier JSON ?
Ouvrez un fichier en mode écriture avec l'encodage UTF-8, puis appelez json.dump(votre_liste, f, indent=2, ensure_ascii=False). Utilisez toujours json.dump() (pas json.dumps()) pour la sortie fichier — il écrit directement dans le descripteur de fichier sans créer de chaîne intermédiaire en mémoire.
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)Pourquoi json.dumps() transforme True en true et None en null ?
Les booléens Python (True, False) et None ne sont pas des tokens JSON valides. La spécification JSON utilise true, false et null en minuscules. json.dumps() gère cette correspondance automatiquement — True devient true, False devient false, None devient null. Vous n'avez pas besoin de les convertir manuellement. Dans l'autre sens, json.loads() les reconvertit en types Python.
Comment gérer les objets datetime lors de la conversion de données CSV en JSON ?
Passez une fonction default= à json.dumps() qui convertit les objets datetime en chaînes ISO 8601. La fonction default est appelée pour tout objet que json ne peut pas sérialiser nativement. Retournez obj.isoformat() pour les instances datetime et levez TypeError pour tout le reste.
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"}Peut-on convertir du CSV en JSON sans pandas ?
Oui. La bibliothèque standard Python contient tout le nécessaire. Utilisez csv.DictReader pour lire chaque ligne sous forme de dictionnaire, collectez les lignes dans une liste, et sérialisez avec json.dump() ou json.dumps(). Aucune bibliothèque tierce requise. pandas ne vaut la peine d'être ajouté que si vous avez également besoin de nettoyage de données, d'inférence de types, ou si vous l'utilisez déjà ailleurs dans le projet.
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)Pour une alternative en un clic sans écrire de Python, essayez le convertisseur CSV vers JSON — collez vos données CSV et obtenez une sortie JSON formatée immédiatement.
Outils connexes
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.