Première · Traitement de données en tables

Lire et représenter un fichier CSV

Un fichier CSV paraît simple : des lignes et des séparateurs. Pourtant, une virgule dans un nom, une valeur vide ou un nombre lu comme texte suffisent à modifier l’analyse. Importer une table consiste à reconstruire correctement sa structure et ses types.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

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.

PositionContenu
0A1
1Paris, centre
218

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.

Exercice 1 · S’entraîner#

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.

Exercice 2 · S’entraîner#

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.

Exercice 3 · S’entraîner#

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.

Exercice 4 · S’entraîner#

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.

Exercice 5 · Approfondir et relier#

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.

Exercice 6 · Approfondir et relier#

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.

Exercice 7 · Approfondir et relier#

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 split pour 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’import pré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.

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.