Traitement de données en tables
Première · NSI · Traitement de données et algorithmique
Traitement de données et algorithmique
Les données en table : du fichier CSV au programme
Une part énorme des données du monde réel — annuaires, résultats sportifs, relevés météo, catalogues, données ouvertes des collectivités — se présente sous forme de tables : des lignes et des colonnes. Savoir importer une table, la parcourir, en extraire une information et la trier est l'une des compétences les plus directement utiles de l'année.
| nom | prenom | age | classe | note |
|---|---|---|---|---|
| Dubois | Lea | 17 | 1A | 15 |
| Martin | Sam | 16 | 1B | 12 |
| Nguyen | Ines | 17 | 1A | 18 |
| Oliveira | Tom | 16 | 1B | 12 |
Le format CSV
Le CSV (Comma-Separated Values, valeurs séparées par des virgules) est le format d'échange de tables le plus répandu. C'est un simple fichier texte :
nom,prenom,age,classe,note
Dubois,Lea,17,1A,15
Martin,Sam,16,1B,12
Sa force tient à sa simplicité : la première ligne contient les descripteurs, chaque ligne suivante est un enregistrement, et les valeurs sont séparées par un caractère convenu. Un fichier CSV s'ouvre aussi bien dans un tableur que dans un éditeur de texte ou un programme Python, il ne dépend d'aucun logiciel propriétaire et il se lit à l'œil nu. C'est pourquoi les portails de données ouvertes le proposent systématiquement.
Traitement de données et algorithmique
Rechercher, trier et fusionner des tables
Une fois la table en mémoire, trois opérations couvrent l'essentiel des besoins : sélectionner les enregistrements qui répondent à un critère, trier selon un descripteur, et fusionner deux tables qui partagent une information commune.
Sélectionner et calculer
La sélection s'écrit naturellement avec une compréhension de liste munie d'un filtre :
classe_a = [e for e in table if e["classe"] == "1A"]
On obtient une nouvelle table, contenant uniquement les enregistrements retenus — la table d'origine n'est pas modifiée.
La projection consiste à ne garder que certains descripteurs :
noms = [e["nom"] for e in table]
Et les calculs s'enchaînent : moyenne = sum([e["note"] for e in table]) / len(table). Sur notre table de quatre élèves, cela donne (15 + 12 + 18 + 12) / 4 = 57 / 4 = 14,25.
Trier selon un descripteur
Trier une table de dictionnaires demande de préciser sur quel descripteur comparer : c'est le rôle du paramètre key, auquel on passe une fonction qui, à un enregistrement, associe la valeur à comparer.
par_note = sorted(table, key=lambda e: e["note"])
Le mot-clé lambda définit une petite fonction anonyme sur une seule ligne. Pour un tri décroissant, on ajoute reverse=True.
Le tri de Python est stable : deux enregistrements de même clé conservent leur ordre relatif d'origine. Cette propriété n'est pas un détail — elle permet de trier sur plusieurs critères en enchaînant les tris, du critère le moins important au plus important.
| Écriture | Ce qu'elle renvoie | Effet sur la table d'origine |
|---|---|---|
| sorted(table, key=…) | une NOUVELLE table triée | aucun : l'originale est intacte |
| table.sort(key=…) | None | la table est triée sur place |
| sorted(table, key=…, reverse=True) | une nouvelle table en ordre décroissant | aucun |
| [e for e in table if condition] | une nouvelle table filtrée | aucun |
Exercices corrigés
Dans une table de données, que représente une ligne ?
- A.Un descripteur, c'est-à-dire le nom d'une caractéristique de la table
- B.Une valeur unique, c'est-à-dire une seule donnée contenue dans une case
- C.Un enregistrement, c'est-à-dire un individu décrit par tous les descripteursBonne réponse
- D.Le nom d'une colonne, c'est-à-dire un descripteur commun à toute la table
Réponse : C — Un enregistrement, c'est-à-dire un individu décrit par tous les descripteurs
Une ligne rassemble toutes les informations connues sur un même individu : c'est un enregistrement. Les COLONNES, elles, portent les descripteurs (nom, âge, note), et une case au croisement d'une ligne et d'une colonne contient une valeur. Ce vocabulaire est celui des sujets d'examen, il vaut la peine de le fixer une bonne fois.
Que signifie l'acronyme CSV ?
- A.Comma-Separated Values, des valeurs séparées par des virgulesBonne réponse
- B.Compressed Storage Version, un format compressé
- C.Column Sorted Values, des valeurs triées par colonne
- D.Computer Standard Values, un standard de calcul
Réponse : A — Comma-Separated Values, des valeurs séparées par des virgules
CSV signifie Comma-Separated Values. C'est un fichier TEXTE dans lequel les valeurs d'une même ligne sont séparées par un caractère convenu — la virgule à l'origine, mais souvent le point-virgule dans les exports francophones, puisque la virgule y sert déjà de séparateur décimal. Le CSV n'est ni compressé, ni trié : sa force est justement d'être minimal et lisible tel quel.
On veut trier une table par classe croissante puis, à classe égale, par note décroissante. Les notes sont des entiers. Quelle écriture convient ?
- A.sorted(table, key=lambda e: (e["note"], e["classe"]))
- B.sorted(table, key=lambda e: (e["classe"], -e["note"]))Bonne réponse
- C.sorted(table, key=lambda e: e["classe"] + e["note"])
- D.sorted(table, key=lambda e: (e["classe"], e["note"]), reverse=True)
Réponse : B — sorted(table, key=lambda e: (e["classe"], -e["note"]))
Quand la fonction key renvoie un TUPLE, Python compare d'abord le premier élément, puis départage les égalités avec le second : c'est exactement la hiérarchie de critères recherchée. La classe vient donc en premier, en ordre croissant. Pour inverser uniquement le second critère, on prend l'opposé de la note : avec -e["note"], la plus grande note devient la plus petite valeur et remonte en tête. Le distracteur 4 est le piège principal : reverse=True inverserait les DEUX critères, y compris la classe. Le distracteur 3 tenterait d'additionner une chaîne et un entier, ce qui déclenche une erreur. Variante possible sans opposé : trier d'abord par note décroissante, puis par classe, en s'appuyant sur la stabilité du tri.
Que contient habituellement la première ligne d'un fichier CSV ?
- A.Le nombre total d'enregistrements du fichier
- B.Le premier enregistrement de la table
- C.La date de création du fichier
- D.Les descripteurs, c'est-à-dire les noms des colonnesBonne réponse
Réponse : D — Les descripteurs, c'est-à-dire les noms des colonnes
La première ligne, appelée en-tête, donne le nom de chaque colonne : c'est elle qui permet à un programme de savoir que la troisième valeur est un âge. C'est d'ailleurs sur elle que s'appuie csv.DictReader pour fabriquer les clés des dictionnaires. Conséquence directe : cette ligne n'est PAS un enregistrement, et il ne faut pas la compter dans le nombre de données.
Qu'appelle-t-on un descripteur dans une table de données ?
- A.Le contenu d'une case de la table
- B.Une caractéristique observée sur tous les enregistrements, correspondant à une colonneBonne réponse
- C.Le nombre de lignes de la table
- D.Un enregistrement qui sert d'exemple
Réponse : B — Une caractéristique observée sur tous les enregistrements, correspondant à une colonne
Un descripteur — on dit aussi attribut ou champ — est une propriété relevée pour chacun des individus de la table : le nom, l'âge, la classe. Il correspond donc à une colonne. Le contenu d'une case, lui, s'appelle une valeur, et c'est le croisement d'un enregistrement et d'un descripteur. Retiens la triade : enregistrement (ligne), descripteur (colonne), valeur (case).
Pourquoi le format CSV est-il très utilisé pour échanger des données ouvertes ?
- A.C'est un simple fichier texte, lisible par un tableur, un éditeur de texte ou un programme, sans logiciel propriétaireBonne réponse
- B.Il compresse fortement les données, ce qui accélère les téléchargements
- C.Il empêche toute modification des données une fois le fichier créé
- D.Il vérifie automatiquement que les données saisies sont correctes
Réponse : A — C'est un simple fichier texte, lisible par un tableur, un éditeur de texte ou un programme, sans logiciel propriétaire
Le CSV doit tout à sa simplicité : du texte brut, une structure évidente, aucune dépendance à un éditeur de logiciel. N'importe quel outil peut le produire et le relire, aujourd'hui comme dans vingt ans, ce qui en fait le format naturel des portails de données ouvertes. En contrepartie, il ne fait rien d'autre : pas de compression, pas de protection, et surtout aucune vérification des données — un CSV peut parfaitement contenir un âge écrit « douze ».
En Python, quelle structure de données représente le plus naturellement une table importée d'un CSV ?
- A.Une chaîne de caractères contenant tout le fichier
- B.Un dictionnaire dont les clés sont les numéros de ligne
- C.Un tuple de tuples, non modifiable
- D.Une liste de dictionnaires, un dictionnaire par enregistrementBonne réponse
Réponse : D — Une liste de dictionnaires, un dictionnaire par enregistrement
C'est la structure produite par csv.DictReader et celle attendue dans les sujets. Chaque enregistrement devient un dictionnaire dont les clés sont les descripteurs, et l'ensemble forme une liste. On accède alors très lisiblement à une donnée avec table[2]["note"] : l'indice choisit la ligne, la clé choisit la colonne — bien plus clair que de retenir que la note est la cinquième valeur.
Un CSV contient la valeur 17 dans la colonne age. Après importation avec csv.DictReader, de quel type est e["age"] ?
- A.Du type int, Python reconnaît les nombres automatiquement
- B.Du type str : c'est la chaîne "17"Bonne réponse
- C.Du type float, car les valeurs numériques sont converties en flottants
- D.Cela dépend de la présence d'un point décimal dans le fichier
Réponse : B — Du type str : c'est la chaîne "17"
Un fichier CSV est du texte pur : rien n'y distingue un nombre d'un mot. Le module csv ne devine donc rien et renvoie systématiquement des chaînes. Il faut convertir soi-même, par exemple avec e["age"] = int(e["age"]). Sans cette conversion, e["age"] + 1 déclenche une erreur, et les comparaisons se font dans l'ordre alphabétique — ce qui donne des résultats surprenants.
Que fait l'instruction sorted(table, key=lambda e: e["nom"]) ?
- A.Elle trie la table sur place et ne renvoie rien
- B.Elle renvoie uniquement la liste des noms, triée
- C.Elle renvoie une nouvelle table triée par ordre croissant du descripteur nom, sans modifier l'originaleBonne réponse
- D.Elle supprime de la table les enregistrements sans nom
Réponse : C — Elle renvoie une nouvelle table triée par ordre croissant du descripteur nom, sans modifier l'originale
La fonction sorted construit et renvoie une NOUVELLE liste : la table d'origine reste intacte. Le paramètre key reçoit une fonction qui, à chaque enregistrement, associe la valeur servant de critère de comparaison — ici la valeur du descripteur nom. Les enregistrements complets sont conservés, pas seulement les noms. C'est la méthode table.sort() qui trie sur place, et elle renvoie None.
Quelle expression sélectionne les enregistrements dont le descripteur classe vaut "1A" ?
- A.[e for e in table if e["classe"] == "1A"]Bonne réponse
- B.[e for e in table if e == "1A"]
- C.[e["classe"] for e in table]
- D.table["classe"] == "1A"
Réponse : A — [e for e in table if e["classe"] == "1A"]
La sélection combine une compréhension de liste et un filtre : on parcourt les enregistrements et on ne garde que ceux dont le descripteur voulu a la bonne valeur. Attention au distracteur 2 : e est un dictionnaire entier, le comparer à une chaîne renvoie toujours False. Le distracteur 3 est une projection, pas une sélection : il renvoie la liste des classes de tous les élèves. Quant au 4, table est une liste, on ne l'indexe pas par un nom de colonne.
À quoi sert le paramètre reverse=True dans un appel à sorted ?
- A.À inverser l'ordre des colonnes de la table
- B.À trier sur le dernier descripteur au lieu du premier
- C.À annuler le tri précédent
- D.À trier par ordre décroissantBonne réponse
Réponse : D — À trier par ordre décroissant
Par défaut sorted trie en ordre croissant ; reverse=True renverse ce classement. Pour obtenir les trois meilleures notes, on écrit donc sorted(table, key=lambda e: e["note"], reverse=True) puis on prend la tranche [0:3]. Le paramètre n'a aucun effet sur les colonnes, qui ne sont de toute façon pas ordonnées dans un dictionnaire.
Que faut-il impérativement pour fusionner deux tables de données ?
- A.Qu'elles aient le même nombre d'enregistrements
- B.Qu'elles partagent un descripteur commun permettant de faire correspondre les enregistrementsBonne réponse
- C.Qu'elles proviennent du même fichier CSV
- D.Qu'elles aient exactement les mêmes descripteurs
Réponse : B — Qu'elles partagent un descripteur commun permettant de faire correspondre les enregistrements
Une fusion, ou jointure, s'appuie sur une information présente des deux côtés : un identifiant de classe, une référence produit, un code postal. C'est elle qui indique quel enregistrement de la première table va avec quel enregistrement de la seconde. Le nombre de lignes peut parfaitement différer — c'est même l'usage courant : trente élèves et deux classes. Et si les deux tables avaient exactement les mêmes descripteurs, la fusion n'apporterait aucune information nouvelle.
S'entraîner sur ce chapitre
Ce chapitre compte 35 exercices corrigés dans l'application, avec le suivi de ta progression.
Commencer les exercices