cours1 min de lecture
Du tableau à la liste de dictionnaires — lecture d'un fichier CSV en Python vanilla.
programme

Introduction

Quand vous ouvrez un fichier de notes d'élèves, un export comptable ou un relevé météo, vous tombez presque toujours sur la même structure : des lignes qui décrivent chacune une entité (un élève, une opération, un jour de mesure) et des colonnes qui décrivent chacune un attribut (nom, montant, température). C'est la forme tabulaire — celle d'un cahier d'appel, d'un bulletin de notes ou d'une feuille de tableur — omniprésente parce qu'elle est simple à produire, à lire à l'œil nu et à transmettre.

Pour qu'un programme manipule ces données, il faut leur donner une représentation en mémoire. Ce premier cours vous présente le format CSV (le plus universel des formats tabulaires textuels) et le modèle de données que nous adopterons dans tout le chapitre : la liste de dictionnaires.

Vocabulaire d'une table

Une table de données est définie par :

TermeDéfinition
Ligne (ou enregistrement)Une entité décrite, une unité d'information.
Colonne (ou champ)Un attribut commun à toutes les lignes.
Descripteur (ou en-tête)Le nom d'une colonne.
CelluleL'intersection d'une ligne et d'une colonne — une valeur unique.
DomaineL'ensemble des valeurs autorisées pour une colonne.
Les descripteurs sont partagés par toutes les lignes : chaque ligne contient une valeur pour chacun des descripteurs. C'est ce qui permet de parler de table « rectangulaire ».

Voici une table d'exemple que nous utiliserons tout au long du chapitre — une liste d'élèves avec leur âge et leur classe :

nomageclasse
Alice161G2
Bob171G3
Chloé161G2
Dimitri171G2
Élodie161G3

Le format CSV

CSV signifie Comma-Separated Values — valeurs séparées par des virgules. C'est un format texte ultra simple, lisible par n'importe quel éditeur, qu'un humain peut écrire à la main. La première ligne contient en général les descripteurs, les lignes suivantes les enregistrements :

nom,age,classe
Alice,16,1G2
Bob,17,1G3
Chloé,16,1G2
Dimitri,17,1G2
Élodie,16,1G3
Le séparateur peut varier (,, ;, tabulation). En France, beaucoup de fichiers Excel exportent en CSV avec le point-virgule comme séparateur, parce que la virgule sert déjà de séparateur décimal. Vérifiez toujours.

précise que la lecture d'une table tabulée ou CSV est une capacité attendue du programme.

Dans un CSV, à quoi sert la première ligne en général ?

Modèle de données : la liste de dictionnaires

Pour représenter une table en mémoire, plusieurs choix existent. Nous adoptons la liste de dictionnaires pour tout le chapitre :

eleves = [
    {"nom": "Alice",   "age": 16, "classe": "1G2"},
    {"nom": "Bob",     "age": 17, "classe": "1G3"},
    {"nom": "Chloé",   "age": 16, "classe": "1G2"},
    {"nom": "Dimitri", "age": 17, "classe": "1G2"},
    {"nom": "Élodie",  "age": 16, "classe": "1G3"},
]

Chaque ligne est un dictionnaire qui associe descripteur → valeur. La table entière est une liste de ces dictionnaires.

Pourquoi ce choix ? Parce qu'il est expressif : eleve["nom"] se lit comme une phrase. Et parce qu'il est stable : ajouter une colonne ne change pas l'ordre d'accès aux autres valeurs.

Combien de clés a chaque dictionnaire de la liste eleves ?

Lecture d'un CSV avec le module csv

Python fournit en standard le module csv. Sa classe DictReader lit directement un fichier CSV et produit, pour chaque ligne, un dictionnaire dont les clés sont les en-têtes. C'est exactement le modèle que nous voulons.

import csv

with open("eleves.csv", encoding="utf-8") as f:
    lecteur = csv.DictReader(f)
    eleves = list(lecteur)

print(eleves[0])
# {'nom': 'Alice', 'age': '16', 'classe': '1G2'}
Toutes les valeurs lues par csv.DictReader sont des chaînes de caractères, même "16". Si une colonne est numérique, il faut convertir explicitement avec int(...) ou float(...).

Pour convertir l'âge en entier au moment de la lecture :

import csv

with open("eleves.csv", encoding="utf-8") as f:
    lecteur = csv.DictReader(f)
    eleves = []
    for ligne in lecteur:
        ligne["age"] = int(ligne["age"])
        eleves.append(ligne)

print(eleves[0])
# {'nom': 'Alice', 'age': 16, 'classe': '1G2'}

Accès aux données

Une fois la table en mémoire, on l'exploite avec les opérations habituelles sur listes et dictionnaires :

⏵ Ctrl+↵ pour exécuter
Aucune exécution pour l'instant.

Sortie attendue :

Première ligne : {'nom': 'Alice', 'age': 16, 'classe': '1G2'}
Nom du 2e élève : Bob
Alice a 16 ans
Bob a 17 ans
Chloé a 16 ans

Cas particuliers et pièges

  • Encodage : un CSV produit sous Windows peut être en cp1252 ou en utf-8-sig (avec BOM). Si l'ouverture lève une erreur d'encodage, essayez encoding="utf-8-sig".
  • Séparateur : csv.DictReader accepte un paramètre delimiter que l'on passe lors de l'appel, par exemple csv.DictReader(f, delimiter=";").
  • Valeurs vides : une cellule vide donne "", pas None.
  • Espaces parasites : les exports Excel peuvent contenir des espaces en fin de cellule. Le strip() est votre ami.

Pour aller plus loin

Le module csv propose aussi csv.DictWriter pour écrire une liste de dictionnaires dans un fichier CSV. Une fois que vous saurez filtrer ou trier une table (cours suivants), vous saurez aussi sauvegarder le résultat.