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.