Chapitre 1 : Les fichiers CSV et l'importation de données¶
Programme officiel (B.O.)¶
B.O. spécial n° 1 du 22 janvier 2019 - NSI Première
| Contenus | Capacités attendues | Commentaires |
|---|---|---|
| Données en tables | Importer une table depuis un fichier texte tabulé ou un fichier CSV. | Est utilisé un téléchargement d'un fichier ouvert au téléchargement et non la connexion à une base de données. |
1. Les données tabulées¶
1.1 Qu'est-ce qu'une table de données ?¶
Une table de données est un ensemble d'informations organisées en lignes et colonnes, comme un tableur :
| Nom | Prénom | Âge | Ville |
|---|---|---|---|
| Dupont | Marie | 16 | Lyon |
| Martin | Léo | 17 | Paris |
| Durand | Emma | 16 | Lille |
Chaque ligne est un enregistrement (une entrée, un individu). Chaque colonne est un attribut (ou descripteur) : Nom, Prénom, Âge, Ville.
1.2 Vocabulaire¶
| Terme | Signification |
|---|---|
| Table | Ensemble structuré de données en lignes et colonnes |
| Enregistrement | Une ligne de la table (un individu) |
| Attribut (ou champ, descripteur) | Une colonne de la table (une propriété) |
| Valeur | Le contenu d'une cellule |
2. Le format CSV¶
2.1 Définition¶
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).
2.2 Exemple¶
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
Séparateur
En France, le séparateur est souvent le point-virgule (;) car la virgule est utilisée comme séparateur décimal dans les nombres. Les fichiers internationaux utilisent la virgule (,).
2.3 Avantages du CSV¶
- 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.
2.4 Limites du CSV¶
- 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).
3. Lire un fichier CSV en Python¶
3.1 Lecture manuelle (sans module)¶
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"},
...
]
Attention
Toutes les valeurs sont des chaînes de caractères. Il faudra convertir les nombres avec int() ou float() si nécessaire.
3.2 Lecture avec le module csv¶
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.
3.3 Choisir le séparateur¶
Si le fichier utilise un point-virgule :
4. Écrire un fichier CSV en Python¶
4.1 Avec le module csv¶
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 :
Le paramètre newline=""
Sur Windows, il faut passer newline="" à open() pour éviter des lignes vides entre les enregistrements.
5. Représentation en mémoire¶
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:
6. Conversion des types¶
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".
7. Résumé¶
| Concept | Détail |
|---|---|
| Table de données | Lignes (enregistrements) et colonnes (attributs) |
| CSV | Format texte, valeurs séparées par un délimiteur |
| Séparateur | Virgule (,) ou point-virgule (;) |
| En Python | Tableau de dictionnaires |
Module csv |
DictReader (lecture), DictWriter (écriture) |
| Conversion | Les valeurs CSV sont des chaînes, à convertir avec int() / float() |
| Encodage | Toujours préciser encoding="utf-8" |