Convertir CSV en JSON avec Python — Guide json.dumps()

·Backend Developer·Révisé parPriya Sharma·Publié

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.
Before · json
After · json
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"
  }
]
Remarque :Remarquez que quantity et price apparaissent comme des chaînes JSON ("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

Python 3.10+
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 :

Python 3.10+ — sortie avec indentation
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.

Python 3.10+ — sort_keys et ensure_ascii
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=(",", ":").

Remarque :Un dict Python et un objet JSON se ressemblent presque identiquement à l'affichage. La différence : 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.

Python 3.10+ — conversion CSV vers JSON complète
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() :

Python 3.10+ — lignes CSV comme chaîne JSON
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.

Python 3.10+ — coercition de types pour les lignes CSV
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.

Python 3.10+ — default= pour datetime, UUID, Decimal
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"
# }
Avertissement :Levez toujours 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().

Python 3.10+ — sérialisation de dataclass
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"
# }
Remarque :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.

Paramètre
Type
Défaut
Description
obj
Any
(requis)
L'objet Python à sérialiser — dict, list, str, int, float, bool, None
indent
int | str | None
None
Nombre d'espaces (ou une chaîne) par niveau d'indentation. None = sortie compacte sur une ligne
sort_keys
bool
False
Trie les clés du dictionnaire par ordre alphabétique dans la sortie
ensure_ascii
bool
True
Échappe tous les caractères non-ASCII en \\uXXXX. Mettre False pour émettre directement en UTF-8
default
Callable | None
None
Fonction appelée pour les objets non sérialisables par défaut — retourner une valeur sérialisable ou lever TypeError
separators
tuple[str, str] | None
None
Remplace (séparateur_items, séparateur_clés). Utiliser (",", ":") pour une sortie compacte sans espaces
skipkeys
bool
False
Ignore les clés de dict qui ne sont pas str, int, float, bool ou None au lieu de lever TypeError
allow_nan
bool
True
Autorise float("nan"), float("inf"), float("-inf"). Mettre False pour lever ValueError sur ces valeurs
cls
Type[JSONEncoder] | None
None
Sous-classe JSONEncoder personnalisée à utiliser à la place de celle par défaut

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].

Python 3.10+ — DictReader avec délimiteur personnalisé
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"
#   }
# ]
Avertissement :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

Python 3.10+ — conversion de fichier avec gestion d'erreurs
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

Python 3.10+ — réponse API CSV vers 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.

Python 3.10+ — validation aller-retour
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 keys

Conversion 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é.

bash — one-liner CSV vers JSON
python3 -c "
import csv, json, sys
rows = list(csv.DictReader(sys.stdin))
json.dump(rows, sys.stdout, indent=2)
" < inventory.csv > inventory.json
bash — rediriger un fichier CSV et formater avec json.tool
python3 -c "import csv,json,sys; print(json.dumps(list(csv.DictReader(sys.stdin))))" < data.csv | python3 -m json.tool
bash — convertir et valider avec jq
python3 -c "import csv,json,sys; json.dump(list(csv.DictReader(sys.stdin)),sys.stdout)" < report.csv | jq .
Remarque :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.

bash — installer orjson
pip install orjson
Python 3.10+ — CSV vers JSON avec 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.

bash — installer rich
pip install rich
Python 3.10+ — sortie JSON avec 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)
Avertissement :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

Python 3.10+ — streaming CSV vers NDJSON
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

Python 3.10+ — ijson pour lire de gros fichiers 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")
Remarque :Passez au NDJSON ou au streaming quand le CSV dépasse 50–100 Mo. 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

Utiliser json.dumps() puis écrire séparément dans un fichier

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.

Before · Python
After · Python
json_string = json.dumps(rows, indent=2)
with open("output.json", "w") as f:
    f.write(json_string)  # unnecessary intermediate string
with open("output.json", "w", encoding="utf-8") as f:
    json.dump(rows, f, indent=2, ensure_ascii=False)  # direct write
Oublier de convertir les valeurs CSV de chaîne en nombres

Problè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.

Before · Python
After · Python
rows = list(csv.DictReader(f))
json.dumps(rows)
# [{"port": "8080", "workers": "4"}]  ← strings, not numbers
rows = 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 integers
Omettre encoding='utf-8' à l'ouverture des fichiers

Problè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.

Before · Python
After · Python
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))
Utiliser str() ou repr() au lieu de json.dumps()

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.

Before · Python
After · Python
output = str({"active": True, "note": None})
# "{'active': True, 'note': None}"  ← NOT valid JSON
output = json.dumps({"active": True, "note": None})
# '{"active": true, "note": null}'  ← valid JSON

json.dumps() vs Alternatives — Comparaison rapide

Méthode
Sortie
JSON valide
Types personnalisés
Vitesse
Installation requise
json.dumps()
str
via paramètre default=
Référence
Non (stdlib)
json.dump()
écrit dans un fichier
via paramètre default=
Référence
Non (stdlib)
csv.DictReader + json
str ou fichier
via paramètre default=
Référence
Non (stdlib)
pandas to_json()
str ou fichier
✓ datetime natif
~2x plus rapide pour les gros volumes
pip install pandas
orjson.dumps()
bytes
✓ datetime/UUID natif
5–10x plus rapide
pip install orjson
dataclasses.asdict() + json
str
via paramètre default=
Référence
Non (stdlib)
polars write_json()
str ou fichier
✓ datetime natif
~3x plus rapide pour les gros volumes
pip install polars

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.

Python 3.10+
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.

Python 3.10+
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.

Python 3.10+
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.

Python 3.10+
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

MS
Maria SantosBackend Developer

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.

PS
Priya SharmaRéviseur technique

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.