n° 209
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Données sales et formats mal formés
Énoncé
Écrire exporter(table, chemin). Vérifier que réimporter le fichier redonne la table de départ — et dire à quelle condition exactement.
Corrigé
import csv
def exporter(table, chemin, separateur=","):
"""Écrit la table en CSV, avec sa ligne d'en-tête.
Précondition : table non vide, toutes les lignes ont les mêmes clés.
Postcondition : le fichier a len(table) + 1 lignes.
"""
assert len(table) > 0, "table vide"
colonnes = list(table[0].keys())
with open(chemin, "w", encoding="utf-8", newline="") as f:
e = csv.DictWriter(f, fieldnames=colonnes, delimiter=separateur)
e.writeheader()
for ligne in table:
e.writerow(ligne)
L'aller-retour, et sa condition. On teste la propriété d'inversion du chapitre 1 :
exporter(eleves, "sortie.csv")
relu = importer("sortie.csv")
relu == eleves # False !
convertir(relu, "moyenne", float)
relu == eleves # True
Sans la conversion, l'égalité est fausse : la colonne moyenne est revenue en texte. Le CSV ne conserve pas les types, il ne conserve que les caractères. La condition exacte de l'aller-retour est donc : réappliquer, à la lecture, les conversions faites à l'import précédent. Un format de fichier qui, lui, garde les types — JSON par exemple — n'aurait pas ce défaut.
Le second piège, celui des guillemets. Une adresse contenant le séparateur est écrite par DictWriter avec des guillemets :
Nour,"12, rue des Lilas"
et l'aller-retour, lui, passe : importer(chemin) == piege vaut True. Le module fait les deux moitiés du travail, protection à l'écriture et interprétation à la lecture. Écrire soi-même ",".join(...) casserait le fichier — et c'est le split(",") de la banque d'entraînement, vu de l'autre côté.
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.