NSI (Spé) — Traitement de données en tables
Traitement de données en tables
Fichiers CSV, recherche, tri, fusion de tables
Résumé synthétiqueFiche en 4 sectionsQuiz de 10 questionsGratuit, sans pub
Résumé
Les données structurées sont souvent stockées dans des fichiers CSV (Comma-Separated Values), où chaque ligne est un enregistrement et les colonnes sont séparées par des virgules ou des points-virgules. En Python, le module csv lit et écrit ces fichiers, et on manipule les données en mémoire sous forme de liste de dictionnaires : chaque dictionnaire est une ligne, les noms de colonnes en sont les clés. Trois opérations reviennent sans cesse : la recherche (filtrer selon un critère), le tri (par une colonne) et la fusion de tables (jointure sur une clé commune). On peut ainsi filtrer les élèves de moyenne supérieure à 14, trier des villes par population, ou relier une table d'élèves à une table de classes.
Un fichier CSV est un simple fichier texte qui range des données en tableau : une ligne par enregistrement, des colonnes séparées par un caractère. C'est le format d'échange le plus universel — Excel, bases de données et Python le lisent tous.
- Définition : CSV = Comma-Separated Values, un format texte pour données tabulaires.
- Structure : la première ligne donne les en-têtes (noms de colonnes), les suivantes les données.
- Séparateur : la virgule, ou le point-virgule en France (car la virgule sert de séparateur décimal).
- Lecture : import csv puis csv.DictReader lit chaque ligne comme un dictionnaire.
- Type : toutes les valeurs lues sont des chaînes ; il faut convertir avec int() ou float().
Exemple
import csv ; reader = csv.DictReader(open('eleves.csv', encoding='utf-8')) lit chaque ligne sous la forme {'nom': 'Dupont', 'age': '16', 'moyenne': '14.5'}. Pour comparer les moyennes, on convertit : float(ligne['moyenne']).
Piège à éviter
Tout ce qui sort d'un CSV est du texte : '16' > '9' est faux car comparé alphabétiquement. Convertis en int() ou float() avant tout calcul ou tri numérique.
Une fois la table en mémoire, la première opération est d'en extraire ce qui nous intéresse. On distingue la sélection (choisir des lignes selon un critère) et la projection (choisir des colonnes). En Python, les listes en compréhension expriment tout cela en une ligne.
- Sélection : garder les lignes qui vérifient un critère donné.
- Exemple : [e for e in eleves if float(e['moyenne']) > 14] retient les bons élèves.
- Projection : ne garder que certaines colonnes, ex. [e['nom'] for e in eleves].
- Combinaison : [e['nom'] for e in eleves if e['classe'] == '1A'] mêle filtre et projection.
- Complexité : une recherche séquentielle parcourt toute la table, soit $O(n)$.
Exemple
bons = [e['nom'] for e in eleves if float(e['moyenne']) >= 14] renvoie directement la liste des noms des élèves ayant au moins 14 de moyenne.
Piège à éviter
N'oublie pas la conversion dans le test : if e['moyenne'] > 14 compare une chaîne à un nombre et lève une erreur (ou compare mal). Écris if float(e['moyenne']) > 14.
Trier réorganise les lignes selon une colonne : par ordre alphabétique des noms, par moyenne décroissante, etc. La fonction sorted de Python fait le travail, à condition de lui indiquer quelle valeur comparer grâce au paramètre key.
- Tri alphabétique : sorted(eleves, key=lambda e: e['nom']).
- Tri numérique décroissant : sorted(eleves, key=lambda e: float(e['moyenne']), reverse=True).
- Le paramètre key : une fonction qui extrait la valeur de comparaison de chaque ligne.
- Le paramètre reverse : True pour décroissant, False (défaut) pour croissant.
- Tri stable : deux lignes égales conservent leur ordre d'origine.
Exemple
classement = sorted(eleves, key=lambda e: float(e['moyenne']), reverse=True) range les élèves du meilleur au moins bon. classement[0] est alors le major de la classe.
Piège à éviter
Sans conversion dans la key, le tri est alphabétique : '100' arrive avant '9'. Pense à float() ou int() dans le lambda pour un tri vraiment numérique.
La fusion (ou jointure) combine deux tables partageant une colonne commune, appelée clé de jointure. C'est l'opération qui permet, par exemple, d'afficher pour chaque élève le nom de sa salle, alors que les deux informations vivent dans des tables séparées.
La jointure relie deux tables sur une clé commune (ici classe_id = id) pour réunir leurs informations.
- Principe : combiner deux tables ayant une colonne commune (la clé de jointure).
- Exemple : table eleves (nom, classe_id) + table classes (id, salle) → nom et salle réunis.
- Méthode naïve : deux boucles imbriquées cherchant les correspondances sur la clé.
- Syntaxe (Python 3.9+) : [e | c for e in eleves for c in classes if e['classe_id'] == c['id']].
- Optimisation : indexer une table dans un dictionnaire fait passer de $O(n \times m)$ à $O(n + m)$.
Exemple
On indexe d'abord les classes par leur id : index = {c['id']: c for c in classes}. Puis pour chaque élève : salle = index[e['classe_id']]['salle']. Cette table intermédiaire évite la double boucle.
Piège à éviter
La jointure naïve à deux boucles imbriquées coûte $O(n \times m)$ : sur de grosses tables, elle devient très lente. Indexer une table par sa clé dans un dictionnaire ramène le coût à $O(n + m)$.
Quiz - Traitement de données en tables
10 questions
S'entraîner
Articles utiles
Questions fréquentes
Les points clés à retenir sur Traitement de données en tables, extraits du quiz de révision.
Que signifie CSV ?
Réponse :
Comma-Separated Values
CSV signifie Comma-Separated Values : des valeurs séparées par des virgules.
En France, quel séparateur remplace souvent la virgule dans les CSV ?
Réponse :
Le point-virgule
On utilise le point-virgule car la virgule sert déjà de séparateur décimal (14,5 au lieu de 14.5).
Avec csv.DictReader, de quel type sont les valeurs lues ?
Réponse :
str (chaîne)
DictReader lit tout comme des chaînes (str). Il faut convertir soi-même avec int() ou float().
Quelle expression filtre les élèves de moyenne > 14 ?
Réponse :
[e for e in eleves if float(e['moyenne']) > 14]
En Python, on filtre avec une liste en compréhension et une condition if, en convertissant la moyenne en float.