Adloun

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.