NSIpremiere spe

NSI · premiere speGratuit

Chapitre 3Traitement de données en tables

L'essentiel en 30 secondes

Les données tabulaires sont stockées dans des fichiers CSV (valeurs séparées par des virgules). En Python, on les manipule avec le module csv. Chaque ligne devient un dictionnaire. On sait rechercher, filtrer, trier et fusionner des tables. Le tri se fait avec sorted() et une clé (key).

Notions clés

Fichier CSV
Fichier texte où chaque ligne est un enregistrement et les valeurs sont séparées par un délimiteur (virgule, point-virgule…).
Table (liste de dictionnaires)
En Python, une table est représentée par une liste de dictionnaires, chaque dictionnaire étant une ligne.
Recherche / Filtrage
Sélectionner les lignes qui vérifient un critère. Se fait par compréhension de liste.
Tri
Ordonner les lignes selon un critère avec sorted(table, key=...) ou table.sort(key=...).
Fusion de tables
Combiner deux tables partageant un attribut commun (équivalent d'une jointure en base de données).

Formules

Lecture d'un CSV avec csv.DictReader

importcsv\nwithopen(fichier.csv,r)asf:\ntable=list(csv.DictReader(f))`import csv\nwith open('fichier.csv', 'r') as f:\n table = list(csv.DictReader(f))`

Condition : Chaque ligne est un dictionnaire {en-tête: valeur}

Filtrage par compréhension

[ligneforligneintableifligne[age]>16]`[ligne for ligne in table if ligne['age'] > '16']`

Condition : Attention : les valeurs CSV sont des chaînes, penser à convertir avec int()

Tri par attribut

sorted(table,key=lambdal:l[nom])`sorted(table, key=lambda l: l['nom'])`

Condition : Renvoie une nouvelle liste triée. reverse=True pour l'ordre décroissant.

Fusion (jointure)

[a,bforaint1forbint2ifa[id]==b[id]]`[{**a, **b} for a in t1 for b in t2 if a['id'] == b['id']]`

Condition : Fusionne deux tables sur un attribut commun. Complexité O(n×m)O(n\times m).

A retenir

  • Les valeurs lues dans un CSV sont TOUJOURS des chaînes de caractères. Il faut convertir explicitement avec int() ou float().
  • sorted() renvoie une NOUVELLE liste triée ; .sort() trie EN PLACE (modifie la liste originale).
  • Une fusion de tables revient à croiser deux tables sur un attribut commun : c'est une double boucle.

Erreurs classiques

Erreur : Comparer des chaînes comme des nombres : '9' > '10' vaut True (ordre lexicographique)

Correction : Convertir en int avant de comparer : int(ligne['age']) > 10

Erreur : Oublier de fermer le fichier CSV après ouverture

Correction : Toujours utiliser with open(...) as f: qui ferme automatiquement le fichier

Erreur : Trier sans key : sorted(table) plante sur une liste de dictionnaires

Correction : Toujours spécifier key=lambda l: l['attribut'] pour indiquer le critère de tri

Astuce méthode

Au DSDS, écris d'abord ta compréhension de liste EN FRANÇAIS avant de coder : 'Je veux toutes les lignes où l'âge est supérieur aˋ16[là 16' \to [l for linl in table ifint(l[age])>16]if int(l['age']) > 16].