Adloun

Traiter des données en tables

Cours · NSI (première), chapitre 6 · première, spécialité numérique et sciences informatiques · le début du chapitre, la suite sur Adloun

Des données en table : chaque ligne est un enregistrement, chaque colonne un attribut, et l'on peut filtrer ou trier.

Les deux chapitres précédents ont donné deux structures. En les combinant, on obtient celle qui porte la quasi-totalité des données du monde réel : un tableau de dictionnaires partageant les mêmes clés. Le programme le dit ainsi — « les données organisées en table correspondent à une liste de p-uplets nommés qui partagent les mêmes descripteurs ».

Résultats sportifs, relevés météo, catalogues, horaires de transport, données ouvertes des administrations : tout cela arrive en tables, et le plus souvent dans un fichier CSV.

Hors programme : Ce n'est pas encore une base de données

Le programme est net : cette rubrique « permet de préparer les élèves à aborder la notion de base de données qui ne sera présentée qu'en classe terminale », et il s'agit de travailler « dans un langage de programmation ordinaire et non dans un système de gestion de bases de données ». Aucun SQL ici, aucun SGBD : du Python, des tableaux et des dictionnaires.

6.1 Ce qu'est une table

Définition 6.1Table, descripteur, enregistrement

Une table est un tableau d'enregistrements qui possèdent tous les mêmes champs. Le nom d'un champ s'appelle un descripteur — c'est le titre de la colonne ; un enregistrement est une ligne.


eleves = [
    {"nom": "Nour",    "classe": "1G3", "moyenne": 15.5,  "option": "NSI"},
    {"nom": "Camille", "classe": "1G1", "moyenne": 12.0,  "option": "SVT"},
    {"nom": "Yanis",   "classe": "1G3", "moyenne": 9.5,   "option": "NSI"},
]
Figure : Anatomie d'une table. Chaque ligne est un enregistrement ; tous partagent les mêmes descripteurs — c'est ce qui distingue une table d'un simple tableau de dictionnaires.

Deux façons de désigner une case, et le programme les autorise toutes deux : le tableau de p-uplets nommés ci-dessus — eleves[0]["moyenne"] — ou le tableau doublement indexé du chapitre 4 — t[0][2]. La première est préférable dès que les colonnes ont un sens : ["moyenne"] reste juste si l'on insère une colonne, [2] devient faux en silence. C'est l'argument du chapitre 4 sur les p-uplets nommés, appliqué à des milliers de lignes.

6.2 Importer une table

Capacité attendue

« Importer une table depuis un fichier texte tabulé ou un fichier CSV. »

Définition 6.2CSV

Un fichier CSV (comma-separated values) est un fichier texte où chaque ligne est un enregistrement et où les champs sont séparés par un caractère convenu — le plus souvent la virgule, parfois le point-virgule ou une tabulation. La première ligne porte généralement les descripteurs.


nom,classe,moyenne,option
Nour,1G3,15.5,NSI
Camille,1G1,12.0,SVT
Yanis,1G3,9.5,NSI
Sofia,1G2,17.25,NSI
Adam,1G1,13.0,SES

import csv

def importer(chemin, separateur=","):
    """Table lue depuis un fichier CSV à ligne d'en-tête.

    Précondition  : le fichier existe, est encodé en UTF-8, et sa première
                    ligne porte les descripteurs.
    Postcondition : toutes les lignes renvoyées ont exactement les mêmes clés.
    """
    with open(chemin, "r", encoding="utf-8", newline="") as f:
        table = [dict(ligne) for ligne in csv.DictReader(f, delimiter=separateur)]
    if len(table) > 0:
        descripteurs = set(table[0].keys())
        assert all(set(l.keys()) == descripteurs for l in table), "lignes heterogenes"
    return table
ImportantTout ce qui sort d'un CSV est du texte

C'est le piège numéro un du chapitre. Un fichier texte ne contient que des caractères : après l'import, ligne["moyenne"] vaut la chaîne "15.5", pas le nombre . Les conséquences sont silencieuses et fausses :


"9.5" > "15.5"          # True  <- chaines : '9' vient apres '1'
9.5 > 15.5              # False <- la verite

Une table triée par moyenne sans conversion place donc les mauvais élèves en tête, sans le moindre message d'erreur. Convertir les colonnes numériques fait partie de l'import, pas des finitions.

Exercices du chapitre

La suite du cours · Tous les exercices du chapitre