Lire un fichier de données
Le projet
Mama Brigitte tient une petite boutique à Yaoundé. Pendant trois mois, elle a noté chaque vente dans un cahier. Son neveu a tout recopié dans un tableur, puis l'a enregistré dans un fichier ventes.csv. Elle te pose quatre questions :
- Combien ai-je gagné en tout ?
- Quel produit me rapporte le plus ?
- Quel mois a été le meilleur ?
- Lequel de mes trois vendeurs vend le plus ?
Elle pourrait faire les additions à la main. Mais avec 42 ventes, c'est long, et avec 42 000 ventes, c'est impossible. Tu vas écrire un programme qui répond à tout ça en une fraction de seconde, et qui marchera encore le mois prochain, avec de nouvelles ventes.
Ce module est un projet : tout ce que tu as appris (variables, conditions, boucles, fonctions, dictionnaires) va servir. Tu vas apprendre trois choses nouvelles en chemin : lire un fichier, gérer les erreurs et écrire un fichier.
Qu'est-ce qu'un fichier CSV ?
Voici le début de ventes.csv :
date,produit,quantite,prix_unitaire,vendeur
2026-01-01,riz,5,1200,Awa
2026-01-02,huile,10,1500,Paul
Et le même contenu, vu comme un tableau :
| date | produit | quantite | prix_unitaire | vendeur |
|---|---|---|---|---|
| 2026-01-01 | riz | 5 | 1200 | Awa |
| 2026-01-02 | huile | 10 | 1500 | Paul |
La date est écrite AAAA-MM-JJ (année, mois, jour). Ce format a un gros avantage : trier les dates comme des textes les met aussi dans l'ordre chronologique. Il servira au cours 3.
Excel, Google Sheets, LibreOffice : tous les tableurs savent ouvrir et enregistrer des CSV. C'est le format le plus simple pour échanger des données entre deux logiciels.
Ouvrir et lire un fichier
Pour lire un fichier en Python, on l'ouvre, on lit son contenu, puis on le ferme.
with open("ventes.csv", encoding="utf-8") as f:
contenu = f.read()
print(contenu)
Lis cette ligne de gauche à droite : « avec le fichier ventes.csv ouvert, appelé f dans le bloc... ».
as fdonne un nom au fichier ouvert.fest une convention, commeipour un compteur.f.read()lit tout le fichier et le renvoie sous forme d'un seul texte, retours à la ligne compris.- Après le bloc, le fichier est fermé, mais la variable
contenugarde le texte lu.
Lire tout le fichier
Le fichier ventes.csv est fourni : ouvre-le ci-dessous pour voir son contenu, puis lance le code. Essaie ensuite de changer le nom en "vente.csv" (sans le s) pour voir l'erreur.
with open("ventes.csv", encoding="utf-8") as f:
contenu = f.read()
print(type(contenu))
print(len(contenu), "caractères")
print(contenu[:120])
Découper en lignes
f.read() donne un seul long texte. Nous, on veut traiter les ventes une par une. Il faut donc découper ce texte en lignes.
with open("ventes.csv", encoding="utf-8") as f:
lignes = f.read().splitlines()
print(lignes[0]) # date,produit,quantite,prix_unitaire,vendeur
print(lignes[1]) # 2026-01-01,riz,5,1200,Awa
print(len(lignes)) # 43 : l'en-tête + 42 ventes
f.read().splitlines() enchaîne deux méthodes : f.read() renvoie le texte, puis .splitlines() s'applique à ce texte.
Pour sauter l'en-tête, tu connais déjà l'outil : une tranche. lignes[1:] est la liste de toutes les lignes à partir de l'index 1, donc sans la ligne 0.
for ligne in lignes[1:]:
print(ligne)
Exercice : Combien de ventes ?
Ouvre ventes.csv, découpe-le en lignes, et range dans nb_ventes le nombre de ventes (donc sans compter l'en-tête). Affiche-le.
Voir une solution
with open("ventes.csv", encoding="utf-8") as f:
lignes = f.read().splitlines()
nb_ventes = len(lignes) - 1
print(nb_ventes)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Découper une ligne en colonnes
Une ligne comme "2026-01-01,riz,5,1200,Awa" est un seul texte. Pour récupérer le produit ou la quantité, on la découpe aux virgules avec .split(","), que tu as déjà utilisé avec les espaces :
ligne = "2026-01-01,riz,5,1200,Awa"
morceaux = ligne.split(",")
print(morceaux) # ['2026-01-01', 'riz', '5', '1200', 'Awa']
Chaque colonne a maintenant son index : 0 pour la date, 1 pour le produit, 2 pour la quantité, 3 pour le prix, 4 pour le vendeur.
Le déballage
Écrire morceaux[0], morceaux[1]... devient vite illisible. Python permet de ranger chaque élément d'une liste dans sa propre variable, en une ligne :
date, produit, quantite, prix, vendeur = ligne.split(",")
print(produit) # riz
Tu l'as déjà fait sans le savoir dans for mot, n in compteur.items(): et dans for q, p in zip(quantites, prix):.
Pratique : Découpe une ligne
Tape chaque ligne, et prévois le résultat avant d'appuyer sur Entrée.
Un terminal simulé t'attend dans l'appli, sans rien installer. Pratiquer
Exercice : Le chiffre d'affaires, à la main
Parcours les ventes (sans l'en-tête), découpe chaque ligne et calcule le chiffre d'affaires total dans total. Affiche Chiffre d'affaires : 142050 FCFA.
Voir une solution
with open("ventes.csv", encoding="utf-8") as f:
lignes = f.read().splitlines()
total = 0
for ligne in lignes[1:]:
date, produit, quantite, prix, vendeur = ligne.split(",")
total += int(quantite) * int(prix)
print(f"Chiffre d'affaires : {total} FCFA")Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Combien de sacs de riz ?
Calcule dans sacs la quantité totale de riz vendue (pas le montant : le nombre de sacs). Affiche Riz vendu : 29 sacs.
Voir une solution
with open("ventes.csv", encoding="utf-8") as f:
lignes = f.read().splitlines()
sacs = 0
for ligne in lignes[1:]:
date, produit, quantite, prix, vendeur = ligne.split(",")
if produit == "riz":
sacs += int(quantite)
print(f"Riz vendu : {sacs} sacs")Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Ranger les ventes dans des dictionnaires
Les deux exercices précédents répètent le même travail : ouvrir, découper, déballer, convertir. Pour chaque nouvelle question, il faudrait tout recommencer. Un programmeur fait mieux : il écrit une fonction qui lit le fichier une fois pour toutes et renvoie des données prêtes à l'emploi.
Quelle forme pour ces données ? Tu l'as vu dans le module précédent : une liste de dictionnaires, un dictionnaire par vente.
[
{"date": "2026-01-01", "produit": "riz", "quantite": 5, "prix": 1200, "vendeur": "Awa"},
{"date": "2026-01-02", "produit": "huile", "quantite": 10, "prix": 1500, "vendeur": "Paul"},
...
]
Avantages :
- on écrit
v["produit"]au lieu demorceaux[1]: le code se lit tout seul ; - les nombres sont déjà convertis : plus besoin de
int()partout ; - toutes les fonctions de calcul des prochains cours prendront cette liste en entrée.
Exercice : La brique de lecture : lire_ventes
Écris la fonction lire_ventes(nom_fichier). Elle ouvre le fichier dont le nom est donné, et renvoie la liste des ventes, chacune sous forme de dictionnaire avec les clés "date", "produit", "quantite", "prix" et "vendeur". La quantité et le prix doivent être des nombres entiers.
Le correcteur la testera sur ventes.csv et sur un deuxième fichier, petit.csv.
Voir une solution
def lire_ventes(nom_fichier):
"""Lit un fichier CSV de ventes et renvoie une liste de dictionnaires."""
with open(nom_fichier, encoding="utf-8") as f:
lignes = f.read().splitlines()
ventes = []
for ligne in lignes[1:]:
date, produit, quantite, prix, vendeur = ligne.split(",")
ventes.append({
"date": date,
"produit": produit,
"quantite": int(quantite),
"prix": int(prix),
"vendeur": vendeur,
})
return ventes
ventes = lire_ventes("ventes.csv")
print(len(ventes), "ventes")
print(ventes[0])Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Teste-toi
Un fichier contient 3 lignes : l'en-tête, puis 2 ventes. Après lignes = f.read().splitlines(), que vaut len(lignes[1:]) ?
- 3
- 2 (bonne réponse)
- 1
- Une erreur, car on ne peut pas trancher une liste de lignes