Adloun

Un CSV a deux colonnes portant le même descripteur

Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 6 — Traiter des données en tables · Données sales et formats mal formés

Énoncé

Un CSV a deux colonnes portant le même descripteur. Que fait csv.DictReader ? Quelle donnée est perdue, et comment le détecter avant l'import ?

Corrigé


nom,note,note
Nour,12,18
Camille,9,15

t = [dict(l) for l in csv.DictReader(open("dbl.csv", encoding="utf-8", newline=""))]
list(t[0].keys())   # ['nom', 'note']
t[0]                # {'nom': 'Nour', 'note': '18'}

Aucune erreur, et une colonne perdue. Un dictionnaire ne peut pas avoir deux fois la même clé : la seconde valeur écrase la première. La note de a disparu, et il ne reste que — sans le moindre avertissement. La table a l'air correcte : deux descripteurs, deux lignes, aucune valeur vide.

La détection, avant l'import. Elle se fait sur la ligne d'en-tête, pas sur la table — une fois la table construite, l'information est déjà perdue.


entete = open(chemin, encoding="utf-8").readline().strip().split(separateur)
assert len(entete) == len(set(entete)), "descripteur en double : " + str(entete)

Ici len(entete) vaut et len(set(entete)) vaut : l'assertion se déclenche.

La leçon générale. Le tableau doublement indexé du chapitre 4 n'aurait rien perdu : il n'a pas de clés, seulement des positions. Chaque représentation a ses angles morts, et celui du p-uplet nommé est l'unicité des descripteurs. **Le contrôle doit porter sur le fichier, avant que le format ne l'ait déjà déformé.**

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.