Retour au cours

csv : lire/écrire des tableaux simples

le module standard csv permet d’échanger des tableaux avec d’autres outils.

objectifs

  • lire un CSV avec csv.DictReader
  • écrire un CSV avec csv.DictWriter
  • comprendre newline="" et encoding="utf-8"
  • filtrer/transformer des lignes

explication détaillée

lecture :

  • csv.DictReader(f) rend chaque ligne sous forme de dict str -> str
  • convertir les types explicitement (int(...), float(...)) si besoin écriture :
  • csv.DictWriter(f, fieldnames=...)
  • writeheader(), puis writerow(...) / writerows(...)

exemples exécutables

import csv

with open("data.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["name", "score"])
    w.writerows([["ana", "12"], ["bob", "18"]])

with open("data.csv", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    rows = list(reader)
    print(rows)
# filtrer et sauvegarder
rows_num = [{"name": r["name"], "score": int(r["score"])} for r in rows if r["score"].isdigit()]
best = [r for r in rows_num if r["score"] >= 15]
with open("best.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.DictWriter(f, fieldnames=["name", "score"])
    w.writeheader()
    w.writerows(best)

bonnes pratiques

  • ouvrir avec newline="" pour éviter les lignes vides “fantômes” sous windows
  • normaliser/valider les types dès la lecture
  • gérer les valeurs manquantes explicitement

pièges courants

  • supposer que toutes les colonnes sont présentes → tester in row
  • oublier de convertir les types (tout est str à la lecture)
  • problème d’encodage → préciser encoding="utf-8"

exercices

  1. charger notes.csv et calculer la moyenne de la colonne score (ignorer non numériques).
  2. filtrer les lignes où city == "paris" et écrire vers paris.csv.
  3. ajouter une colonne passed = score >= 10 et sauver vers with_passed.csv.