Aller au contenu

Partie 1 : Les fichiers CSV et l'importation de données


Une table de données est un ensemble d'informations organisées en lignes et colonnes, comme un tableur :

NomPrénomÂgeVille
DupontMarie16Lyon
MartinLéo17Paris
DurandEmma16Lille

Chaque ligne est un enregistrement (une entrée, un individu). Chaque colonne est un attribut (ou descripteur) : Nom, Prénom, Âge, Ville.

TermeSignification
TableEnsemble structuré de données en lignes et colonnes
EnregistrementUne ligne de la table (un individu)
Attribut (ou champ, descripteur)Une colonne de la table (une propriété)
ValeurLe contenu d'une cellule

Le format CSV (Comma-Separated Values, valeurs séparées par des virgules) est un format texte simple pour stocker des données tabulées.

Un fichier CSV est un fichier texte brut dans lequel :

  • La première ligne contient les noms des attributs (l'en-tête) ;
  • Chaque ligne suivante contient un enregistrement ;
  • Les valeurs sont séparées par un séparateur (virgule, point-virgule ou tabulation).

Le fichier eleves.csv :

nom,prenom,age,ville
Dupont,Marie,16,Lyon
Martin,Léo,17,Paris
Durand,Emma,16,Lille
Petit,Hugo,15,Marseille
  • Universel : lisible par tout éditeur de texte, tout tableur, tout langage de programmation.
  • Léger : pas de mise en forme, juste les données brutes.
  • Interopérable : permet d'échanger des données entre logiciels différents.
  • Pas de typage : tout est du texte (les nombres sont des chaînes qu'il faut convertir).
  • Pas de structure complexe (pas d'imbrication comme en JSON).
  • Problèmes si une valeur contient le séparateur (il faut alors l'entourer de guillemets).

On peut lire un CSV ligne par ligne et découper chaque ligne :

table = []
with open("eleves.csv", "r", encoding="utf-8") as fichier:
lignes = fichier.readlines()
en_tete = lignes[0].strip().split(",")
for ligne in lignes[1:]:
valeurs = ligne.strip().split(",")
enregistrement = {}
for i in range(len(en_tete)):
enregistrement[en_tete[i]] = valeurs[i]
table.append(enregistrement)
print(table)

Résultat :

[
{"nom": "Dupont", "prenom": "Marie", "age": "16", "ville": "Lyon"},
{"nom": "Martin", "prenom": "Léo", "age": "17", "ville": "Paris"},
...
]

Le module csv de Python gère les cas particuliers (guillemets, séparateurs dans les valeurs, etc.) :

import csv
table = []
with open("eleves.csv", "r", encoding="utf-8") as fichier:
lecteur = csv.DictReader(fichier)
for ligne in lecteur:
table.append(dict(ligne))
print(table)

csv.DictReader renvoie chaque ligne sous forme de dictionnaire, avec les noms de colonnes comme clés.

Si le fichier utilise un point-virgule :

lecteur = csv.DictReader(fichier, delimiter=";")

import csv
eleves = [
{"nom": "Dupont", "prenom": "Marie", "age": 16, "ville": "Lyon"},
{"nom": "Martin", "prenom": "Léo", "age": 17, "ville": "Paris"},
{"nom": "Durand", "prenom": "Emma", "age": 16, "ville": "Lille"}
]
with open("sortie.csv", "w", encoding="utf-8", newline="") as fichier:
colonnes = ["nom", "prenom", "age", "ville"]
ecrivain = csv.DictWriter(fichier, fieldnames=colonnes)
ecrivain.writeheader()
for eleve in eleves:
ecrivain.writerow(eleve)

Le fichier sortie.csv produit :

nom,prenom,age,ville
Dupont,Marie,16,Lyon
Martin,Léo,17,Paris
Durand,Emma,16,Lille

En Python, une table de données se représente naturellement comme un tableau de dictionnaires :

table = [
{"nom": "Dupont", "prenom": "Marie", "age": 16, "ville": "Lyon"},
{"nom": "Martin", "prenom": "Léo", "age": 17, "ville": "Paris"},
{"nom": "Durand", "prenom": "Emma", "age": 16, "ville": "Lille"}
]

Chaque dictionnaire est un enregistrement, chaque clé est un attribut.

Cette structure permet :

  • D'accéder à un enregistrement par son indice : table[0]
  • D'accéder à un attribut d'un enregistrement : table[0]["nom"]
  • De parcourir tous les enregistrements : for e in table:

Les fichiers CSV ne contiennent que du texte. Lors de l'importation, il faut convertir les valeurs numériques :

import csv
table = []
with open("eleves.csv", "r", encoding="utf-8") as fichier:
lecteur = csv.DictReader(fichier)
for ligne in lecteur:
enregistrement = dict(ligne)
enregistrement["age"] = int(enregistrement["age"])
table.append(enregistrement)

Après conversion, table[0]["age"] renvoie l'entier 16 et non la chaîne "16".


ConceptDétail
Table de donnéesLignes (enregistrements) et colonnes (attributs)
CSVFormat texte, valeurs séparées par un délimiteur
SéparateurVirgule (,) ou point-virgule (;)
En PythonTableau de dictionnaires
Module csvDictReader (lecture), DictWriter (écriture)
ConversionLes valeurs CSV sont des chaînes, à convertir avec int() / float()
EncodageToujours préciser encoding="utf-8"