Numérique et sciences informatiques (spécialité) · Première
Indexation de tables et format CSV : exercices de 1re NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Un fichier CSV stocke une table : une ligne par enregistrement, les valeurs d'une ligne étant séparées par un délimiteur (virgule ou point-virgule). 3
- Lu tel quel, il donne un tableau de tableaux : on accède à une valeur par deux indices,
table[i][j]. 3 - Avec la première ligne utilisée comme noms de colonnes, on obtient un tableau de p-uplets nommés, plus lisible :
table[i]["champ"]. 35 - Toutes les valeurs lues dans un fichier sont d'abord du texte : convertis-les (
int,float) avant de calculer ou de comparer.
Comment utiliser ces exercices
Cette page te fait manipuler des tables à la main avant de les confier à Python. Chaque exercice a deux indices et une correction détaillée. Cherche d'abord seul avec une feuille de brouillon, ouvre un indice si tu bloques, et ne regarde la correction qu'à la fin. Le niveau monte progressivement : lecture d'un fichier, accès aux valeurs par leurs indices, puis construction de structures plus pratiques et pièges de conversion.
Repères pour les indices
Avec pandas, on peut aussi inspecter rapidement une table : villes.head() affiche les premières entrées et villes.sample(7) affiche 7 enregistrements pris au hasard. 4 Les exercices ci-dessous restent en Python « de base », pour que tu comprennes ce que pandas fait à ta place.
Les exercices
Exercice 1 Compter les enregistrements
Voici le contenu d'un fichier eleves.csv, dont la première ligne donne le nom des colonnes :
nom,classe,note
Alice,1G2,14
Bruno,1G1,11
Chloé,1G2,16
- Quel est le délimiteur utilisé ?
- Combien de champs possède chaque enregistrement ?
- Combien d'enregistrements contient la table ?
Indice 1
La première ligne n'est pas un enregistrement : elle sert à nommer les colonnes.
Indice 2
Compte les lignes du fichier, puis retire celle de l'en-tête.
Voir la correction pas à pas
Le délimiteur est la virgule : on la voit entre
nom,classeetnote, ainsi que sur chaque ligne de données.Chaque ligne contient trois valeurs séparées par deux virgules : un enregistrement a donc 3 champs (
nom,classe,note).Le fichier compte 4 lignes. La première est l'en-tête, il reste donc 4 − 1 = 3 enregistrements : ceux d'Alice, de Bruno et de Chloé.
La table contient 3 enregistrements de 3 champs chacun. Retiens le réflexe : nombre de lignes du fichier moins une quand il y a un en-tête.
Exercice 2 Lire une valeur par ses indices
Un fichier utilisant le point-virgule comme délimiteur a été lu et découpé. Python a produit ce tableau de tableaux :
lignes = [["nom", "points", "ville"],
["Lina", "12", "Lyon"],
["Marc", "9", "Nantes"],
["Sana", "15", "Lille"]]
- Que vaut
lignes[2][2]? - Quelle expression désigne le nombre de points de Sana ?
- Calcule la somme des points des trois joueurs (après conversion en entiers).
Indice 1
Le premier indice choisit la ligne, le second la colonne, en partant de 0.
Indice 2
lignes[0] est l'en-tête. Les enregistrements commencent à lignes[1].
Voir la correction pas à pas
lignes[2]est la troisième ligne du tableau, c'est-à-dire["Marc", "9", "Nantes"]. Le second indice 2 désigne sa troisième valeur :lignes[2][2]vaut"Nantes".Sana est dans
lignes[3]. Les points sont dans la colonne d'indice 1 : l'expression estlignes[3][1], qui vaut"15"(du texte).On convertit chaque valeur :
int(lignes[1][1])donne 12,int(lignes[2][1])donne 9 etint(lignes[3][1])donne 15.La somme vaut 12 + 9 + 15 = 36 points.
lignes[2][2] vaut "Nantes", la valeur de Sana s'écrit lignes[3][1], et la somme des points est 36. Sans conversion, + aurait collé les textes au lieu de les additionner.
Exercice 3 Le mauvais délimiteur
Une ligne d'un fichier est :
Paris;2,1;75
Ce fichier utilise le point-virgule comme délimiteur, et la virgule y sert de séparateur décimal.
- En séparant correctement la ligne, combien de valeurs obtient-on ? Lesquelles ?
- Une élève sépare par erreur avec
ligne.split(","). Combien de morceaux obtient-elle ? - Pourquoi ce résultat est-il inutilisable ?
Indice 1
Compte le nombre de séparateurs : n séparateurs coupent la ligne en n + 1 morceaux.
Indice 2
Regarde ce que devient la valeur 2,1 quand on coupe sur la virgule.
Voir la correction pas à pas
Avec
ligne.split(";"), on coupe sur deux points-virgules : on obtient 3 valeurs,"Paris","2,1"et"75".La ligne ne contient qu'une seule virgule (celle de
2,1). Couper sur la virgule donne donc 1 + 1 = 2 morceaux :"Paris;2"et"1;75".Ces morceaux mélangent des valeurs de champs différents : le nom de la ville et une partie du nombre sont collés, et le champ
75est perdu au milieu d'un autre. Aucun indice ne permet plus de retrouver la bonne colonne.
Avec le bon délimiteur, on lit 3 valeurs ; avec le mauvais, on obtient 2 morceaux inexploitables. Avant de lire un fichier, identifie toujours son délimiteur.
Exercice 4 Du tableau de tableaux au tableau de dictionnaires
Le texte suivant représente le contenu d'un fichier de livres, séparé par des virgules, avec en-tête :
titre,genre,pages
Le phare,roman,320
Petite histoire,essai,180
Les lanternes,roman,250
Mini-contes,BD,64
La traversée,roman,410
- Écris une fonction
en_table(lignes)qui prend la liste des lignes de texte (en-tête comprise) et renvoie un tableau de dictionnaires, avec le champpagesconverti en entier. - Quelle expression donne le genre du troisième livre ?
- Calcule le nombre total de pages des livres de genre
roman.
Indice 1
Récupère d'abord les noms de champs dans la première ligne, puis associe-les aux valeurs de chaque autre ligne.
Indice 2
Pour la somme, parcours le tableau et n'ajoute pages que si genre vaut "roman".
Voir la correction pas à pas
On sépare l'en-tête :
champs = lignes[0].split(",")donne["titre", "genre", "pages"].Pour chaque ligne suivante, on découpe les valeurs puis on construit un dictionnaire :
def en_table(lignes): champs = lignes[0].split(",") table = [] for ligne in lignes[1:]: valeurs = ligne.split(",") enregistrement = {} for i in range(len(champs)): enregistrement[champs[i]] = valeurs[i] enregistrement["pages"] = int(enregistrement["pages"]) table.append(enregistrement) return tableLe troisième livre est
table[2](les indices partent de 0, et l'en-tête n'est plus danstable). Son genre s'écrittable[2]["genre"]et vaut"roman"(il s'agit de Les lanternes).On additionne les pages des livres de genre
roman: 320 (Le phare), 250 (Les lanternes) et 410 (La traversée).Le total vaut 320 + 250 + 410 = 980 pages.
Le troisième livre est un roman et les trois romans totalisent 980 pages. Le dictionnaire rend le code lisible : livre["genre"] se comprend sans consulter l'en-tête.
Exercice 5 Calculer une moyenne dans chaque enregistrement
Voici une table de résultats, lue dans un fichier CSV avec en-tête et stockée comme tableau de dictionnaires :
resultats = [{"nom": "Eva", "maths": "12", "nsi": "16"},
{"nom": "Karim", "maths": "9", "nsi": "13"},
{"nom": "Zoé", "maths": "15", "nsi": "15"}]
- Écris une boucle qui ajoute à chaque dictionnaire un champ
moyenne, moyenne des deux notes. - Que vaut
resultats[1]["moyenne"]? - Comment retrouver rapidement l'enregistrement d'un élève à partir de son nom ?
Indice 1
Les notes sont du texte : convertis-les avant d'additionner.
Indice 2
Pour retrouver un élève par son nom, pense à un dictionnaire dont les clés sont les noms.
Voir la correction pas à pas
On parcourt la table et on calcule la moyenne de chaque élève :
for eleve in resultats: eleve["moyenne"] = (int(eleve["maths"]) + int(eleve["nsi"])) / 2resultats[1]est le dictionnaire de Karim, dont les notes sont 9 et 13. Sa moyenne est (9 + 13) / 2 = 22 / 2 = 11, doncresultats[1]["moyenne"]vaut11.0.Pour retrouver un élève sans parcourir toute la table, on construit un dictionnaire indexé par le nom :
par_nom = {} for eleve in resultats: par_nom[eleve["nom"]] = eleveAlors
par_nom["Zoé"]["nsi"]donne directement"15".
La moyenne de Karim est 11. Indexer une table par un champ (ici le nom) évite de la parcourir à chaque recherche, à condition que ce champ identifie un seul enregistrement.
Exercice 6 Le piège du texte et du nombre
Un fichier de scores a été lu sans aucune conversion :
scores = ["9", "15", "112", "7"]
- Que renvoie
max(scores)? Pourquoi ? - Écris la ligne qui produit la liste des entiers correspondants.
- Quelle est alors la vraie valeur maximale ?
- Propose une règle de prudence à appliquer à chaque lecture de fichier.
Indice 1
Pour des textes, Python compare caractère par caractère, de gauche à droite, comme dans un dictionnaire.
Indice 2
Une liste en compréhension, [int(s) for s in scores], convertit tous les éléments d'un coup.
Voir la correction pas à pas
Pour des chaînes, la comparaison se fait caractère par caractère. Le premier caractère de
"9"est supérieur à celui de"15"et de"112"(qui commencent par"1") ainsi qu'à celui de"7":max(scores)renvoie donc"9", ce qui est faux pour des scores.On convertit toute la liste :
entiers = [int(s) for s in scores], ce qui donne[9, 15, 112, 7].max(entiers)compare maintenant des nombres : 112 est supérieur à 15, 9 et 7. La valeur maximale est 112.Règle de prudence : dès qu'une colonne contient des nombres, la convertir (
intoufloat) immédiatement à la lecture, avant tout calcul, toute comparaison ou tout tri.
Sans conversion, le « maximum » était "9" ; avec conversion, c'est 112. Cette erreur silencieuse est l'une des plus fréquentes avec les fichiers CSV, car aucune erreur n'est signalée.
Les questions qu'on se pose
Quelle est la différence entre un tableau de tableaux et un tableau de dictionnaires ?
Dans un tableau de tableaux, chaque enregistrement est une liste de valeurs : on y accède par la position de la colonne, table[i][j]. Dans un tableau de dictionnaires, chaque enregistrement associe un nom de champ à sa valeur : on écrit table[i]["champ"]. 35 La seconde forme est plus lisible, puisque le nom du champ figure dans le code, et elle résiste mieux si l'ordre des colonnes change.
Pourquoi mes nombres lus dans un fichier CSV ne se comportent-ils pas comme des nombres ?
Parce qu'un fichier CSV est un fichier texte : chaque valeur lue est d'abord une chaîne de caractères. Additionner deux chaînes les concatène, et comparer deux chaînes se fait caractère par caractère. Il faut convertir explicitement avec int(...) ou float(...) les colonnes numériques avant de calculer, de comparer ou de trier.
Sources
Programme visé : Programme de numérique et sciences informatiques de Première générale · Ministère de l'Éducation nationale (education.gouv.fr)
- Programme de numérique et sciences informatiques de Première générale, Ministère de l'Éducation nationale (education.gouv.fr). Consulté le 7 novembre 2026.
- Programmes et ressources en numérique et sciences informatiques - Voie générale, Éduscol (eduscol.education.gouv.fr). Consulté le 7 novembre 2026.
- Manipulation de tables (Ressource Éduscol - NSI), Éduscol. Consulté le 7 novembre 2026.
- Manipulation de tables avec pandas (Ressource Éduscol - NSI), Éduscol. Consulté le 7 novembre 2026.
- p-uplets nommés et dictionnaires (Ressource Éduscol - NSI), Éduscol. Consulté le 7 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.