HOWTO · Python

Convertir un fichier CSV en fichier JSON en Python

Ce tutoriel montre comment convertir un fichier CSV en fichier JSON en Python

Sur cette page

Convertissez un fichier CSV en JSON avec Python en lisant chaque ligne et en choisissant la structure JSON attendue par votre application. Utilisez pandas si cette bibliothèque fait déjà partie de votre flux de traitement des données ; sinon, les modules intégrés csv et json de Python permettent la conversion sans paquet tiers. Le CSV représente des données tabulaires, tandis que le JSON peut contenir un tableau d’objets par ligne ou d’autres structures : le format de sortie a donc son importance.

Convertir un fichier CSV en JSON avec pandas

Installez pandas dans l’environnement de votre projet si la bibliothèque n’y est pas déjà disponible. read_csv() charge le tableau dans un DataFrame, puis to_json() le sérialise. Pour obtenir un tableau d’objets, définissez orient="records". Avec lines=True, chaque objet JSON est écrit sur une ligne (JSON Lines) ; ce format convient aux outils de traitement en flux, mais ne constitue pas un tableau JSON unique.

Cet exemple autonome crée un petit fichier d’entrée, le convertit, puis relit le JSON obtenu. Le fichier de sortie contient un tableau d’enregistrements dont les clés reprennent les noms de colonnes d’origine.

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd

with TemporaryDirectory() as folder:
    source = Path(folder) / "people.csv"
    destination = Path(folder) / "people.json"
    source.write_text("name,age\nAva,31\nNoah,28\n", encoding="utf-8")

    frame = pd.read_csv(source)
    frame.to_json(destination, orient="records", indent=2)
    records = pd.read_json(destination, orient="records").to_dict(orient="records")
    print(records)

L’option indent rend le JSON plus facile à examiner. Sans elle, le contenu sérialisé est plus compact. Pandas déduit le type de nombreuses valeurs : un champ qui ressemble à un nombre peut ainsi devenir numérique. Vérifiez le résultat si une colonne doit rester du texte, par exemple un identifiant précédé de zéros. Si le fichier CSV utilise un autre séparateur, transmettez-le à read_csv() avec sep. Précisez également l’encodage du fichier s’il diffère de UTF-8.

Convertir un fichier CSV en JSON avec les modules csv et json de Python

La bibliothèque standard permet de convertir les données sans dépendance externe. csv.DictReader utilise la première ligne du fichier CSV comme noms de champs et renvoie les lignes suivantes sous forme de dictionnaires. L’exemple ci-dessous écrit toutes les lignes dans un même tableau JSON, puis analyse le fichier enregistré pour vérifier qu’il contient un JSON valide.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

from pathlib import Path
from tempfile import TemporaryDirectory
import csv
import json

with TemporaryDirectory() as folder:
    source = Path(folder) / "people.csv"
    destination = Path(folder) / "people.json"
    source.write_text("name,age\nAva,31\nNoah,28\n", encoding="utf-8")

    with source.open(newline="", encoding="utf-8") as csv_file:
        rows = list(csv.DictReader(csv_file))

    with destination.open("w", encoding="utf-8") as json_file:
        json.dump(rows, json_file, ensure_ascii=False, indent=2)

    parsed = json.loads(destination.read_text(encoding="utf-8"))
    print(json.dumps(parsed, ensure_ascii=False, indent=2))

Le fichier CSV est ouvert avec newline="", comme le recommande le module csv, et un encodage explicite évite les différences de décodage du texte selon la plateforme. json.dump() écrit une valeur Python dans un fichier ouvert ; json.dumps() renvoie du texte JSON. C’est pourquoi l’exemple utilise cette dernière fonction pour afficher le résultat analysé. L’option ensure_ascii=False laisse les caractères non ASCII lisibles dans le fichier. Supprimez-la si vous préférez des séquences Unicode échappées.

La présence d’une ligne d’en-tête est importante pour DictReader : les noms de colonnes deviennent les clés JSON. Si le fichier n’a pas d’en-tête, indiquez fieldnames lors de la création du lecteur, ou lisez les lignes sous forme de listes et définissez vous-même leur correspondance. Pour un fichier délimité par des points-virgules, utilisez csv.DictReader(csv_file, delimiter=";"). La bibliothèque standard lit chaque champ comme du texte ; convertissez les champs explicitement si les programmes qui les utilisent ont besoin de nombres ou de valeurs booléennes.

Choisir la structure JSON et traiter les valeurs CSV

Un tableau d’objets est souvent adapté aux API et au code d’application : chaque ligne devient un objet dont les clés proviennent de l’en-tête CSV. Avec pandas, orient="records" produit cette structure ; l’exemple utilisant la bibliothèque standard écrit une liste de dictionnaires. Chaque ligne reste ainsi regroupée, et l’index des lignes n’est pas ajouté comme champ distinct.

Pour produire du JSON Lines, sérialisez un enregistrement par ligne au lieu de placer tous les enregistrements dans un tableau. Avec pandas, utilisez orient="records", lines=True. Avec la bibliothèque standard, écrivez chaque ligne avec json.dumps(row), puis ajoutez un saut de ligne. JSON Lines est pratique lorsque les enregistrements sont traités un par un, mais un programme qui attend un document JSON unique peut le rejeter. Choisissez le format attendu par le programme destinataire.

Le CSV ne possède pas de système de types universel. DictReader renvoie des chaînes, y compris pour des valeurs comme "31" ; le JSON les conserve comme chaînes, sauf si le programme les convertit. Lors du chargement, pandas peut déduire des nombres et d’autres types. Choisissez le traitement selon le sens de chaque colonne : conservez par exemple les codes postaux et les identifiants sous forme de chaînes, mais convertissez une quantité en entier si vous devez effectuer des calculs. Les cellules vides nécessitent aussi une règle explicite : conservez-les comme chaînes vides, transformez-les en None (qui devient null en JSON), ou utilisez une option de pandas adaptée aux valeurs manquantes. Ne partez pas du principe que toutes les cellules vides ont la même signification.

Gardez des noms de colonnes stables et uniques. Une en-tête absente, un séparateur inattendu ou un encodage différent peut décaler ou altérer les valeurs. Si des champs contiennent des virgules ou des retours à la ligne, vérifiez que le fichier source respecte les règles de citation du CSV et laissez l’analyseur CSV les traiter au lieu de découper les lignes manuellement.

Valider et dépanner le JSON de sortie

Analysez le résultat après l’écriture si un autre programme doit le lire. json.load() valide un fichier JSON complet et renvoie la valeur Python correspondante ; json.loads() fait de même avec une chaîne. L’exemple utilisant la bibliothèque standard analyse le fichier enregistré avant d’en afficher le contenu. Pour JSON Lines, analysez séparément chaque ligne non vide, car le fichier entier ne forme pas un tableau ou un objet JSON unique.

Si l’analyse échoue, vérifiez que la sortie contient une seule valeur JSON valide, que le fichier n’a pas été tronqué et que le JSON a été produit avec json.dump() ou json.dumps(), plutôt qu’en assemblant manuellement des valeurs. Si le contenu est valide mais que les valeurs sont incorrectes, vérifiez le séparateur, la ligne d’en-tête, l’encodage, la citation des champs et les conversions de types à l’entrée. Si la sortie comporte un niveau d’imbrication inattendu ou un champ d’index, vérifiez la valeur de orient choisie pour pandas : records produit la structure en objets par ligne présentée ici. Enfin, comparez le nombre d’enregistrements analysés au nombre de lignes de données du CSV pour repérer plus facilement toute ligne omise ou dupliquée.