Un cap pour ce chapitre
Ce que vous saurez faire
- Identifier les descripteurs et les lignes d’une table
- Importer un CSV avec une bibliothèque adaptée
- Convertir et valider les champs selon leur domaine
Les bases utiles pour commencer
Une ligne décrit un enregistrement
Une table organise plusieurs enregistrements partageant les mêmes descripteurs. Pour des stations météo, on peut avoir code, ville et temperature. Une ligne associe une valeur à chacun de ces champs. Les descripteurs donnent leur sens aux positions ; ils ne sont pas eux-mêmes une observation à inclure dans la moyenne. Une représentation Python possible est un tableau de dictionnaires, chaque dictionnaire décrivant une ligne. Un tableau de tableaux convient également si l’ordre des colonnes est connu et documenté. La représentation choisie doit conserver les associations entre les champs d’un même enregistrement.
L’ordre des lignes peut être conservé lors de l’import, mais il ne doit pas être confondu avec un identifiant. Une ligne peut se déplacer après tri tout en décrivant le même objet. Les descripteurs et une éventuelle clé permettent de conserver son sens.
Un séparateur ne suffit pas à comprendre le format
CSV signifie valeurs séparées par des virgules, mais de nombreux fichiers utilisent un point-virgule ou une tabulation selon leur convention. Un champ peut contenir le séparateur s’il est correctement entouré de guillemets. Ainsi un nom "Paris, centre" ne représente pas deux colonnes dans un CSV à virgules. Découper naïvement chaque ligne avec split peut casser cette structure. Il est préférable d’utiliser le module csv, qui gère les règles du format. Il faut aussi connaître l’encodage du texte : une structure correcte ne répare pas des caractères mal décodés.
Les guillemets appartiennent aux règles de représentation des champs. Ils ne sont généralement pas une partie du nom une fois la ligne correctement lue. Un véritable lecteur CSV gère aussi des guillemets échappés et parfois des retours à la ligne internes, au-delà de l’exemple simple de l’atelier.
Les champs lus sont d’abord du texte
Un lecteur CSV ne connaît pas automatiquement le domaine métier de chaque colonne. La valeur "18" peut désigner une température à convertir en nombre, un identifiant à conserver comme texte ou un code dont les zéros initiaux sont importants. La conversion doit donc être guidée par les descripteurs. Une valeur vide n’est pas nécessairement zéro. Pour une température, il faut décider si l’on refuse la ligne, si l’on conserve une absence explicite ou si l’on applique une autre règle documentée. Une conversion silencieuse risque de produire une table apparemment propre mais fausse.
Une virgule décimale nécessite une convention distincte du séparateur de champs. Le texte "12,5" ne devient pas directement un nombre avec float en Python. Il faut connaître le format annoncé avant d’effectuer une transformation ciblée, sinon on risque de modifier un identifiant ou un nom.
Contrôler l’import avant de calculer
Après lecture, vérifiez le nombre de lignes, les descripteurs, quelques valeurs et les types effectivement obtenus. Examinez les caractères accentués et les lignes incomplètes. Pour une table de notes, on peut contrôler que les nombres appartiennent à l’intervalle annoncé ; pour des codes, on peut vérifier un format attendu. Ces contrôles préparent la recherche, le tri et la fusion. Le fichier source devrait rester disponible pour comprendre une anomalie plutôt que d’écraser immédiatement les données avec une version transformée dont les décisions seraient difficiles à retracer.
import csv
from io import StringIO
# Un petit fichier fourni directement comme texte pour cet exemple.
contenu = "code;ville;temperature\nA1;Lyon;18\nB2;Nantes;16\n"
fichier = StringIO(contenu)
lignes = list(csv.DictReader(fichier, delimiter=";"))
for ligne in lignes:
ligne["temperature"] = float(ligne["temperature"])
print(lignes)La conversion doit être vérifiée sur plusieurs familles : ligne ordinaire, champ cité contenant le séparateur, valeur vide et donnée numérique invalide. Un fichier entier peut paraître importé tout en ayant décalé les colonnes d’une seule ligne. Les contrôles de structure précèdent donc les calculs.
Préparer une table pour calculer sans perdre les codes
Une table possède les champs code et quantité, avec les lignes 0042;7 et 0100;12. Le code reste textuel pour conserver ses quatre caractères ; la quantité devient un entier. Après préparation, les deux quantités s’additionnent en dix-neuf, tandis que les codes demeurent "0042" et "0100".
Convertir toutes les colonnes en nombres supprimerait des informations du code. Ne rien convertir ferait au contraire concaténer les textes "7" et "12" lors d’une addition textuelle. Le schéma de la table doit donc annoncer une règle par colonne, au lieu d’appliquer une conversion uniforme à toutes les cellules.
Une chaîne de contrôles pour une ligne suspecte
Supposons que l’on attende trois champs : code, ville, température. Si une ligne produit quatre morceaux, vérifiez d’abord si une virgule interne a été interprétée comme séparateur. Si elle produit un seul champ, examinez le séparateur choisi. Si elle produit trois champs mais que le dernier n’est pas numérique, la structure peut être correcte et le contenu invalide.
Ces diagnostics concernent des étapes différentes : décodage des octets, découpage des champs puis conversion de type. Corriger une température ne réparera pas un mauvais encodage. Garder l’entrée source et décrire l’anomalie permet de reprendre la bonne étape sans inventer une donnée de remplacement.
À vous de faire varier les choses
Un séparateur à l’intérieur d’un champ
Comparez un découpage naïf et une lecture qui respecte les guillemets sur la même ligne CSV. Changez ensuite le séparateur choisi.
Lire le résultat de l’expérience initiale
3 champ(s) obtenu(s)
Ligne étudiée : A1,"Paris, centre",18. Le résultat attendu comporte code, ville et température, soit trois champs. Ce lecteur pédagogique traite cette ligne contrôlée ; pour des fichiers réels, utilisez csv.
| Position | Contenu |
|---|---|
| 0 | A1 |
| 1 | Paris, centre |
| 2 | 18 |
La structure d’un fichier repose sur des conventions. Un découpage qui semble simple peut transformer les données avant même leur analyse.
De la compréhension à l’autonomie
À vous de résoudre
Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.
Reconnaître l’en-tête
Un fichier contient code;ville;temperature puis A1;Lyon;18 et B2;Nantes;16. Donnez les descripteurs et le nombre d’observations.
Indice 1
La première ligne nomme les colonnes.
Indice 2
Les lignes suivantes portent les données.
Comprendre la correction
Les descripteurs sont code, ville et temperature. Deux observations sont présentes, pour A1 et B2. Compter l’en-tête comme une troisième station provoquerait notamment une tentative de conversion du mot temperature en nombre. L’import doit donc distinguer explicitement les noms des champs et leurs valeurs.
Une virgule dans le nom
Le CSV à virgules contient A1,"Paris, centre",18. Combien de champs représente-t-il ? Pourquoi split(",") ne suffit-il pas ?
Indice 1
Les guillemets regroupent le nom contenant une virgule.
Indice 2
Le séparateur interne au champ ne délimite pas une nouvelle colonne.
Comprendre la correction
La ligne représente trois champs : « A1 », « Paris, centre » et « 18 », le deuxième contenant lui-même une virgule. Un découpage naïf produit quatre morceaux et perd la convention des guillemets. Un lecteur CSV adapté reconnaît le champ protégé et conserve correctement l’association entre code, nom et température.
Un code avec des zéros
Une colonne code contient "0042" et une colonne quantite contient "0042". Pourquoi leur conversion peut-elle différer malgré un contenu identique ?
Indice 1
Le type dépend du rôle du champ.
Indice 2
Un identifiant n’est pas forcément destiné au calcul.
Comprendre la correction
Le code peut devoir conserver ses quatre caractères pour respecter un identifiant ou un format. La quantité peut être convertie en entier 42 pour permettre les calculs. Convertir les deux de la même façon supprimerait les zéros du code. Le descripteur et le domaine attendu guident donc la préparation des données.
Une température absente
Une ligne possède un champ temperature vide. Pourquoi float("") échoue-t-il ? Proposez une décision explicite sans inventer une mesure.
Indice 1
La chaîne vide n’écrit aucun nombre.
Indice 2
Une absence doit rester distinguable de zéro degré.
Comprendre la correction
float("") ne peut pas interpréter la chaîne comme un nombre et lève une erreur. On peut signaler la ligne incomplète, ou conserver une valeur d’absence selon la convention du programme, puis exclure cette absence des calculs appropriés. La remplacer arbitrairement par zéro créerait une mesure qui n’a jamais été fournie.
Deux colonnes, deux types
Un fichier contient l’en-tête code;quantite, puis 0042;7 et 0100;12. Décrivez la représentation après import et conversion. Calculez la quantité totale et expliquez ce qui se produirait si les quantités restaient des textes additionnés.
Indice 1
Les codes conservent leur largeur textuelle.
Indice 2
Une addition de chaînes réalise une concaténation.
Comprendre la correction
Les codes restent "0042" et "0100" ; les quantités deviennent les entiers sept et douze. Leur somme vaut dix-neuf. Additionner les textes donnerait "712", ce qui ne représente pas le total. Le type doit être choisi selon le rôle de la colonne, indépendamment de l’apparence numérique de son contenu.
Localiser la cause d’un import décalé
La ligne B2,"Nantes, nord",16 doit produire trois champs. Une méthode renvoie quatre morceaux, une autre un seul champ. Proposez une cause pour chaque résultat, puis donnez les trois valeurs attendues.
Indice 1
Une virgule intérieure est protégée par des guillemets.
Indice 2
Un séparateur absent de la ligne ne coupe aucun champ.
Comprendre la correction
Quatre morceaux suggèrent un découpage naïf sur chaque virgule. Un seul champ suggère un séparateur incorrect, comme le point-virgule. Les valeurs attendues sont B2, Nantes, nord comme un seul nom, puis le texte 16. Il faut corriger le découpage avant de convertir la température.
Une moyenne après contrôle des absences
Trois lignes de température contiennent "12", "" et "18". La règle impose de signaler les champs vides et de moyenner seulement les mesures disponibles. Donnez l’effectif, la moyenne et le résultat erroné obtenu en remplaçant le vide par zéro.
Indice 1
Le champ vide ne représente aucune mesure.
Indice 2
Le dénominateur doit compter les valeurs réellement utilisées.
Comprendre la correction
Deux mesures sont disponibles ; leur somme vaut trente et leur moyenne quinze. Remplacer le champ vide par zéro produirait une moyenne dix sur trois valeurs, en inventant une observation. Signaler la ligne incomplète conserve la possibilité de rechercher sa valeur réelle tout en expliquant le calcul effectué.
Les erreurs qui méritent un détour
- Utiliser
splitpour tous les fichiers CSV - Les guillemets et les séparateurs contenus dans les champs demandent un lecteur connaissant le format.
- Convertir tous les chiffres en nombres
- Des codes et identifiants peuvent devoir rester textuels pour conserver leur forme et leur sens.
La fiche à garder
L’essentiel à retenir
- Une table partage des descripteurs communs entre ses
lignes. - Le format, l’encodage et les types sont trois décisions distinctes.
- Contrôler l’
importprécède les analyses.
Cette notion au bac
Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.
- Bac 2026 · Banque nationale · Sujet 12 : Refuge de renards, objets et import CSV typé
- Bac 2026 · Banque nationale · Sujet 13 : Ballon sonde, températures et export cartographique KML
- Bac 2026 · Banque nationale · Sujet 16 : Warming stripes, anomalies et régression linéaire
- Bac 2026 · Banque nationale · Sujet 17 : Budget d’un club et mois oublié dans une boucle
Le prochain pas
Retrouver le catalogue de Première
Ce chapitre s’appuie sur le programme officiel de Première (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.
