Semaine 2 · Jour 4 · 420-SN1

JSON ET XML

Lire et écrire des données structurées : au-delà de la grille du CSV

Quand la grille ne suffit plus

CSV : une grille plate
espece,hauteur erable,12 pin,18
Parfait pour un tableau régulier.
JSON / XML : des données imbriquées
"espece": "erable", "mesures": [12, 14, 13], "vivant": true
Une valeur peut en contenir d'autres (listes, sous-objets).

Beaucoup de données réelles ne tiennent pas dans une grille : une observation contient plusieurs mesures, des sous-parties, des champs optionnels. JSON et XML savent représenter ces structures en arbre.

JSON, c'est du dict et des listes

{ "espece": "erable", "hauteur": 12, "mesures": [12, 14, 13], "vivant": true }
En JSONEn Python
{ }dictionnaire (hashmap)
[ ]liste (tableau)
"..."chaine de caractères
12 / 1.5int / float
true / false / nullTrue / False / None

Petit secret du nom : JSON = JavaScript Object Notation. C'est la syntaxe du langage JavaScript pour ses objets (hashmaps) { } et ses tableaux [ ] - et elle est identique à celle de Python.

Bonne nouvelle : le JSON ressemble presque exactement aux dictionnaires et listes Python (vus au jour des fichiers). Lire du JSON, c'est obtenir directement un dict prêt à l'emploi.

Lire du JSON : json.load

import json with open("arbre.json") as fichier: donnees = json.load(fichier) # -> un dict Python print(donnees["espece"]) # 'erable' print(donnees["mesures"][0]) # 12

json.load(fichier) lit un fichier et le transforme en dict / liste Python. On accède ensuite aux valeurs par leur clé (donnees["espece"]), exactement comme un dictionnaire.

Variante : json.loads(texte) (avec un s) part d'une chaine déjà en mémoire au lieu d'un fichier.

Écrire du JSON : json.dump

import json arbre = {"espece": "pin", "hauteur": 18} with open("sortie.json", "w") as fichier: json.dump(arbre, fichier, indent=2, ensure_ascii=False)

json.dump écrit un dict Python dans un fichier (ouvert en mode "w" = écriture). indent=2 le rend lisible (indenté), et ensure_ascii=False garde les accents (é, à) au lieu de les coder en é.

Le JSON, langue des API web

import requests reponse = requests.get("https://.../arbres.json") donnees = reponse.json() # directement en dict / liste for arbre in donnees: print(arbre["espece"])

La plupart des API du web (météo, NASA, cartes, etc.) répondent en JSON. Avec requests, .json() convertit la réponse directement en dict/liste - pas besoin de fichier intermédiaire. (Voir le diaporama « Accès aux données distantes ».)

XML : des balises imbriquées

<foret> <arbre> <espece>erable</espece> <hauteur>12</hauteur> </arbre> </foret>
Balise ouvrante <espece>
Balise fermante </espece>
Texte entre les deux
Tout s'emboite en arbre

XML décrit les données avec des balises qui s'emboitent (comme le HTML, son cousin). C'est le format de beaucoup de fichiers de configuration, de cartes, et d'échanges entre logiciels.

Lire du XML : ElementTree

import xml.etree.ElementTree as ET arbre = ET.parse("foret.xml") racine = arbre.getroot() for noeud in racine.findall("arbre"): espece = noeud.find("espece").text hauteur = noeud.find("hauteur").text print(espece, hauteur)

ET.parse lit le fichier, getroot() donne la racine de l'arbre. findall("arbre") trouve tous les noeuds d'un nom, find("espece") un seul à l'intérieur, et .text récupère le texte entre les balises.

Écrire du XML (et le raccourci pandas)

XML régulier = une grille
import pandas as pd tableau = pd.read_xml("foret.xml") tableau.to_xml("sortie.xml", index=False)
Cas général = ElementTree
racine = ET.Element("foret") noeud = ET.SubElement(racine, "arbre") ET.SubElement(noeud, "espece").text = "pin" ET.ElementTree(racine).write("sortie.xml")

Si le XML est régulier (toujours les mêmes balises), pandas le lit et l'écrit comme un CSV : read_xml / to_xml. Pour une structure libre, on construit l'arbre à la main avec ElementTree.

Quel format pour quoi ?

La donnée est...FormatOutil
une grille régulièreCSV · Excelpandas, csv
imbriquée (listes, sous-objets)JSONjson.load / dump
une réponse d'API webJSONrequests .json()
des balises (config, échanges)XMLElementTree, pandas

Le réflexe : la donnée est-elle plate ou imbriquée ? Plate → CSV/Excel. Imbriquée → JSON (surtout pour le web) ou XML. Et dans tous les cas, Python sait la lire ET la réécrire.

À TON CARNET !

Lis un petit fichier JSON, affiche une de ses valeurs, puis réécris-le avec une mesure de plus
⤺ Refermer le diaporama