Conversion json.dumps/loads avec ensure_ascii, csv.writer/reader en accès par position, puis DictWriter/DictReader par nom de colonne jusqu'à l'agrégation de Titanic.
Cet article couvre les E/S pour deux formats courants de données structurées — json, fréquemment utilisé par les API web, et csv, qui s'ouvre proprement dans les tableurs.
JSON vs CSV — Quand utiliser lequel ?JSON peut exprimer des paires clé/valeur et des structures imbriquées, donc il est partout dans les réponses d'API web et fichiers de configuration. CSV est un format plat "une ligne = un enregistrement" qui s'ouvre directement dans les tableurs comme Excel, ce qui en fait le pilier de l'analyse de données.
json — Conversion bidirectionnelle entre objets Python et chaînes JSON
JSON (JavaScript Object Notation) est un format texte léger qui exprime la structure avec juste des "paires clé/valeur" et des "listes ordonnées", utilisé comme standard pour les réponses d'API web et fichiers de configuration. Le module json de Python convertit dicts, listes, chaînes, nombres, booléens et None vers et depuis JSON.
Deux fonctions de base suffisent à retenir. json.dumps(objet) convertit Python → chaîne JSON, et json.loads(chaîne) convertit chaîne JSON → Python. Le s final signifie string — c'est ce qui les distingue de dump / load, qui travaillent directement avec les fichiers.
Symétrie de json.dumps et json.loadsLigne du haut : dumps (dump string) = direction Python → chaîne JSON. Ligne du bas : loads (load string) = direction chaîne JSON → Python. Les variantes sans le s (dump / load) travaillent directement avec des objets fichier.
Fonction
Rôle
Notes
json.dumps(obj)
Python → chaîne JSON
retourne un str
json.loads(text)
chaîne JSON → Python
retourne un dict / list / etc.
json.dump(obj, file)
Python → écrire dans un fichier
passer le f de open()
json.load(file)
fichier → Python
passer le f de open()
indent=N
joliment formaté avec indentation de N espaces
pour les lecteurs humains
ensure_ascii=False
émet le non-ASCII tel quel
le défaut les échappe
ensure_ascii vaut True par défaut
Par défaut, json.dumps({"name": "café"}) produit '{"name": "caf\u00e9"}' — les caractères non-ASCII sont échappés en \u. C'est techniquement valide, mais difficile à lire pour un humain et gonfle la taille du fichier, donc pour des données contenant des caractères non-ASCII (accents, emoji, CJK, etc.), prends l'habitude de passer ensure_ascii=False.
Convertis des infos utilisateur en JSON, reparse-les en objet Python, et vérifie le type de chaque variable avec type().
① Importe le module json.
② Construis un dictionnaire avec name="Alice" et une liste d'articles ["Apple", "Banana"] (deux clés : name et items).
③ Convertis le dict en chaîne JSON joliment formatée (indentée) et affiche-la, puis affiche type(text): pour montrer le type de la chaîne JSON (désactive l'échappement non-ASCII au cas où les données contiennent des accents, emoji, etc.).
④ Reparse la chaîne JSON en objet Python, puis affiche type(parsed): et type(items): pour chacun (extrais items de parsed).
⑤ Depuis l'objet parsé, affiche nom : ◯◯ et Premier article : ◯◯ (le premier élément de items).
(Si tu exécutes correctement, une explication apparaîtra.)
Éditeur Python
Exécuter le code pour voir le résultat
Les bases de csv — Gérer les lignes avec reader et writer
CSV (Comma-Separated Values) est un format simple où une ligne séparée par virgules vaut un enregistrement, et comme les tableurs comme Excel peuvent l'ouvrir directement, il est partout dans les flux métier. Le module csv de Python fournit des fonctions pour lire et écrire ce format ligne par ligne.
Les bases sont csv.writer(file) et csv.reader(file) : le premier écrit une liste de valeurs comme une seule ligne, le second lit le CSV ligne par ligne comme une liste de valeurs. Deux pièges : d'abord, tout ce que tu lis revient en chaîne — si tu as besoin d'entiers, convertis avec int() toi-même. Ensuite, passe toujours newline='' à open(...) pour que le module csv puisse gérer lui-même les caractères de saut de ligne.
Ce que font csv.writer et csv.readerwriter.writerow(list)écrit une liste de valeurs comme une ligne CSV. reader fait l'inverse — extrait une ligne CSV comme une liste de valeurs — et surtout, toutes les valeurs ressortent en chaînes.
Passe toujours newline='' à open
Le module csv gère lui-même les caractères de saut de ligne, donc tu dois passer newline='' comme dans open("x.csv", "w", newline=''). L'oublier peut produire des CSV avec des lignes vides sur Windows — un piège classique signalé dans la doc officielle de Python.
Écris une liste d'utilisateurs en CSV, puis relis-la ligne par ligne en utilisant un fichier output.csv sur le système de fichiers du navigateur (VFS).
① Importe le module csv.
② Ouvre output.csv en mode écriture (avec newline=''), construis un writer, et écris 3 lignes : un en-tête ["name", "age"] et deux lignes de données ["Alice", 30] et ["Léa", 25].
③ Réouvre le même fichier en mode lecture (avec newline=''), construis un reader, et affiche les lignes une par une avec for row in reader:.
Éditeur Python
Exécuter le code pour voir le résultat
DictWriter et DictReader — Lire et écrire par nom de colonne
Les csv.writer / reader de la section précédente travaillent par position, donc ajouter des colonnes ou changer leur ordre te force à réécrire chaque accès row[0] / row[1]. DictWriter / DictReader sont des versions qui lisent et écrivent par nom de colonne (en-tête) — tu peux écrire une liste de dicts directement en CSV et la relire comme une liste de dicts.
Les données du monde réel sont surtout des CSV avec une ligne d'en-tête, donc dans les vrais projets tu utiliseras celles-ci bien plus souvent.
Pourquoi DictWriter / DictReader sont pratiquesDictWriter transforme une liste de dicts en CSV avec une ligne d'en-tête définie par fieldnames. DictReader fait l'inverse — lit un CSV avec ligne d'en-tête comme une liste de dicts, donc tu accèdes aux valeurs par nom de colonne comme row["name"].
Écris une liste-de-dicts d'utilisateurs dans users.csv, puis relis et affiche chaque ligne formatée. Essaie de lire par nom de colonne plutôt que par position.
① Importe csv.
② Construis une liste de deux utilisateurs (3 colonnes : name / age / city).
- Premier : name="Alice", age=30, city="Tokyo"
- Second : name="Léa", age=25, city="Osaka"
③ Ouvre users.csv en mode écriture, construis un DictWriter, et écris l'en-tête + les lignes de données (passe fieldnames=["name", "age", "city"]).
④ Réouvre le fichier, construis un DictReader, et affiche chaque ligne sous la forme {name} ({age} ans) {city}.
Éditeur Python
Exécuter le code pour voir le résultat
Exemple réel : agréger titanic.csv
Jusqu'ici nous avons créé de petits jeux de données dans le code et les avons écrits. Finissons par lire un vrai jeu de données et l'agréger. Le sujet est le célèbre jeu de données Titanic sur Kaggle (891 lignes / 12 colonnes), avec des colonnes comme PassengerId / Survived (0 = décédé, 1 = survivant) / Pclass (classe de cabine) / Name / Sex / Age / Fare.
Le python_console de la pratique pré-charge le CSV externe dans le système de fichiers virtuel du navigateur (VFS) via fileUrls, donc ton code peut juste appeler open("titanic.csv"). Nous écrirons la même tâche avec csv.reader (positionnel) et csv.DictReader (par nom de colonne).
Utilise csv.reader positionnel pour lire titanic.csv et compter le nombre total de passagers et de survivants.
① Importe le module csv.
② Ouvre titanic.csv en mode lecture (avec newline='') et construis un reader.
③ Saute la ligne d'en-tête avec next(reader).
④ Boucle sur le reste avec for row in reader: et compte total et survived (lignes où la colonne Survived = index 1 vaut "1").
⑤ Affiche Total : 891 et Survivants : 342.
Éditeur Python
Exécuter le code pour voir le résultat
Utilise csv.DictReader basé sur les noms de colonnes pour lire titanic.csv et calculer la moyenne de la colonne Age. Les données Titanic ont des lignes où Age est vide, donc nous gérerons cela aussi.
① Importe csv.
② Ouvre titanic.csv en mode lecture (avec newline='') et construis un DictReader.
③ Dans la boucle, prends row["Age"] de chaque ligne et collecte uniquement les non-vides avec float(row["Age"]) dans une liste.
④ Affiche le nombre de lignes valides et l'âge moyen (2 décimales) comme ceci :
- Enregistrements valides : ◯ (attendu : 714)
- Âge moyen : ◯◯.◯◯ (attendu : 29.70)
Éditeur Python
Exécuter le code pour voir le résultat
QUIZ
Vérification des connaissances
Répondez à chaque question une par une.
Question 1Que contient la sortie de json.dumps({"name": "café"}, ensure_ascii=False) ?
Question 2Quel est le type des valeurs retournées en lisant des lignes avec csv.reader ?
Question 3Qu'est-ce qui est le mieux adapté pour lire un CSV avec ligne d'en-tête comme une liste de dicts ?