Tables et CSV
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 :
| Terme | Dé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. |
| Cellule | L'intersection d'une ligne et d'une colonne — une valeur unique. |
| Domaine | L'ensemble des valeurs autorisées pour une colonne. |
Voici une table d'exemple que nous utiliserons tout au long du chapitre — une liste d'élèves avec leur âge et leur classe :
| nom | age | classe |
|---|---|---|
| Alice | 16 | 1G2 |
| Bob | 17 | 1G3 |
| Chloé | 16 | 1G2 |
| Dimitri | 17 | 1G2 |
| Élodie | 16 | 1G3 |
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
,, ;, 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.
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'}
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 :
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
cp1252ou enutf-8-sig(avec BOM). Si l'ouverture lève une erreur d'encodage, essayezencoding="utf-8-sig". - Séparateur :
csv.DictReaderaccepte un paramètredelimiterque l'on passe lors de l'appel, par exemplecsv.DictReader(f, delimiter=";"). - Valeurs vides : une cellule vide donne
"", pasNone. - 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.