Lire un fichier csv en python : guide étape par étape

juillet 22, 2026
Rédigé par Arthur Lerudulier

Retrouvez nous chaque semaine pour un nouvel article.

Comprendre le format CSV : un standard universel pour les données tabulaires

Dans l’équipe de Lina, une PME e-commerce, le même fichier doit circuler entre le service support, la compta et l’analytique. Chacun a son outil : Excel pour les uns, un script Python pour les autres, parfois un import dans un CRM. C’est précisément là que le CSV s’impose : un CSV reste lisible, transférable, et suffisamment simple pour transporter des données tabulaires sans imposer un logiciel.

Un fichier CSV représente un tableau : chaque ligne est un enregistrement, chaque colonne une variable. La force du CSV est sa neutralité : ce n’est pas un format “propriétaire”, et son écosystème est immense. Si vous devez envoyer un fichier CSV à un partenaire qui utilise Excel, puis le réutiliser dans Python avec csv, vous jouez sur un terrain commun, ce qui réduit les frictions de compatibilité.

Caractéristiques principales des fichiers CSV et leurs usages dans l’échange de données

Le CSV est un compromis pragmatique : il encode des données en texte, ce qui facilite la versionning (diff Git lisible), l’archivage, et l’audit. Dans la pratique, un fichier de commandes exporté depuis un ERP, un catalogue produits pour une marketplace, ou une extraction d’emails marketing, sort très souvent en CSV parce que l’import est partout.

Chez Lina, l’équipe support exporte depuis Excel un fichier CSV des tickets résolus, tandis que l’équipe data relit ce même fichier pour mesurer les délais. La simplicité du CSV accélère l’échange : on évite les formats lourds, et on conserve une structure tabulaire claire. L’idée clé : un CSV est d’abord un vecteur d’interopérabilité.

Structure typique d’un fichier CSV : lignes d’en-tête et délimiteurs variables

La structure la plus fréquente : une première ligne d’en-tête (noms de colonnes), puis une ligne par enregistrement. La séparation des champs repose sur un delimiter : souvent la virgule, parfois le point-virgule (courant avec Excel selon la locale), plus rarement la tabulation. Un même fichier CSV peut aussi contenir des champs entre guillemets lorsque des valeurs contiennent elles-mêmes une virgule.

Pourquoi autant de variantes ? Parce que le CSV n’est pas un standard “strict” au sens d’un unique RFC universel appliqué de la même manière partout. Les outils choisissent des conventions : delimiter, guillemets, échappement, présence d’en-tête. Retenir ce point évite un piège classique : un fichier peut être “CSV” et pourtant casser si on suppose le mauvais delimiter ou le mauvais encodage.

Élément

Rôle dans un CSV

Exemple

En-tête

Nommer les colonnes pour une lecture par clé

id,client,montant

delimiter

Séparer les champs d’une ligne

, ou ;

Guillemets

Encapsuler une valeur contenant le séparateur

« Paris, France »

encodage

Représenter correctement les accents

utf-8

Le module csv de Python : base native pour lire et écrire des fichiers CSV

Pour manipuler un fichier CSV sans dépendance externe, Python propose csv, un choix naturel quand vous voulez garder un script léger. Le module csv encapsule les détails pénibles : gestion des guillemets, variations de séparateur, et cohérence des retours à la ligne. Résultat : vous vous concentrez sur les données plutôt que sur la plomberie.

Dans le quotidien de Lina, un même fichier arrive parfois exporté de Excel en point-virgule, parfois d’une API en virgule. Le module csv aide à normaliser ces entrées, et permet d’écrire un fichier CSV de sortie compatible avec l’outil cible. Le point important : csv n’est pas “juste un parseur”, c’est une boîte à outils de formats.

Présentation du module csv et gestion des dialectes pour différents formats CSV

La notion centrale est le “dialecte” : un ensemble de paramètres (séparateur, guillemets, échappement, gestion des espaces) qui décrit comment interpréter un CSV. Un reader et un writer travaillent toujours avec un dialecte, même si vous n’en spécifiez pas : ils utilisent une configuration par défaut. Cela devient précieux quand votre fichier vient d’une source dont vous ne contrôlez pas les choix.

Par exemple, si votre fichier CSV utilise un delimiter “;”, vous pouvez le préciser au reader. Si vous devez produire un export consommé par Excel, vous pouvez ajuster le dialecte du writer pour éviter que des colonnes se “décalent”. L’insight à garder : décrire le format vaut mieux que bricoler des split() fragiles.

Contrôler la citation avec les constantes QUOTE_MINIMAL, QUOTE_ALL et QUOTE_NONE

La “citation” détermine quand entourer une valeur de guillemets. Avec csv, les constantes comme QUOTE_MINIMAL, QUOTE_ALL et QUOTE_NONE pilotent le comportement du writer et influencent la robustesse côté reader. QUOTE_MINIMAL n’ajoute des guillemets que si nécessaire (valeur contenant séparateur, retour à la ligne, etc.), tandis que QUOTE_ALL force les guillemets sur tous les champs, pratique pour des imports stricts.

QUOTE_NONE, lui, interdit les guillemets : utile quand un système legacy exige un CSV “nu”, mais cela demande un échappement propre. Dans l’entreprise de Lina, un vieux connecteur refuse les guillemets : le writer doit donc utiliser QUOTE_NONE avec un caractère d’échappement, et le fichier final doit être testé sur un échantillon. La règle : choisir une stratégie de citation, c’est réduire les surprises en production.

Comprendre les classes Dialect pour créer et gérer des dialectes personnalisés

Un dialecte peut être défini par une classe dérivée de csv.Dialect : vous y fixez delimiter, quotechar, doublequote, escapechar, lineterminator, skipinitialspace, quoting. Cette approche est utile quand vous manipulez une famille de fichier au même format et que vous voulez éviter de répéter les paramètres sur chaque reader ou writer. C’est aussi une manière de documenter votre format interne.

Imaginons que Lina standardise les exports logistiques en point-virgule, guillemets doubles, fin de ligne “n”. Définir une classe Dialect rend le code lisible et stable : on sait exactement comment est construit le CSV, et l’on maîtrise mieux les échanges avec Excel. Une bonne configuration est un contrat, pas une supposition.

Enregistrer, récupérer et supprimer des dialectes dans le module csv

csv permet d’enregistrer un dialecte avec register_dialect(), puis de le récupérer par son nom via get_dialect(). Si un test montre qu’un dialecte n’est plus utilisé, unregister_dialect() nettoie l’espace de noms. Sur un projet où plusieurs scripts manipulent le même fichier CSV, c’est une façon d’imposer une cohérence d’écriture et d’éviter que deux writer produisent des sorties incompatibles.

Dans la pratique, l’enregistrement est pratique pour une équipe : “export_v1” devient une convention partagée. Et si un partenaire change de delimiter, vous mettez à jour un seul endroit. Le message final : gérer les dialectes, c’est industrialiser le CSV.

Lire un fichier CSV en Python avec csv.reader() : méthode simple et efficace

Le cœur de la lecture en Python repose souvent sur csv.reader(), qui transforme un flux texte en itérateur de lignes. Chaque ligne est renvoyée sous forme de liste de chaînes, ce qui est direct et performant. Dans un script de Lina, un reader alimente ensuite une validation : colonnes obligatoires, formats de date, montants numériques.

Ce reader n’est pas qu’une fonction : c’est un objet itérable. Vous pouvez appeler next() (donc son __next__) pour obtenir la prochaine ligne, et consulter des attributs utiles comme line_num pour savoir où vous en êtes dans le fichier. En traitement de données, savoir “à quelle ligne ça casse” fait gagner un temps considérable.

Bonnes pratiques pour ouvrir et lire un CSV avec newline= » et gestion des retours à la ligne

Pour lire un fichier CSV correctement, ouvrez-le avec open(…, newline= »). Cette option laisse le module csv gérer les fins de ligne et évite des effets de bord selon le système. Sans newline= », certains environnements peuvent interpréter les retours différemment, ce qui se traduit par des lignes vides ou des enregistrements fusionnés.

Ajoutez aussi un encodage explicite. Un fichier exporté depuis Excel peut être en UTF-8, en UTF-8 avec BOM, ou en Windows-1252 selon les réglages. En fixant encoding=’utf-8′ (ou ‘utf-8-sig’ si BOM), vous stabilisez la lecture et vous évitez des caractères “�” dans les données. Ce petit détail rend le pipeline fiable.

Exemple pratique d’utilisation basique de csv.reader() pour parcourir les lignes

Voici un exemple court, typique d’un contrôle de qualité sur un fichier CSV de commandes. On crée un reader, on lit l’en-tête, puis on parcourt chaque ligne pour vérifier des champs.

import csv

with open("commandes.csv", "r", encoding="utf-8", newline="") as f:
    r = csv.reader(f, delimiter=",")
    entete = next(r)  # __next__ du reader
    for row in r:
        # row est une ligne sous forme de liste
        if len(row) != len(entete):
            print("Ligne incohérente à", r.line_num)

Dans ce scénario, le delimiter est fixé à “,”, mais vous pouvez le changer si le fichier vient de Excel en “;”. L’idée finale : reader + line_num = diagnostic rapide et actionnable.

Accéder aux données CSV par colonnes grâce à csv.DictReader() en Python

Quand le CSV possède une ligne d’en-tête, DictReader est souvent plus confortable qu’un reader “liste”. Avec DictReader, chaque ligne devient un dictionnaire : vous accédez aux valeurs par nom de colonne, ce qui réduit les erreurs d’index et rend le code auto-documenté. Pour Lina, c’est un gain immédiat sur les scripts maintenus à plusieurs.

DictReader s’appuie sur la première ligne comme clés, sauf si vous fournissez fieldnames. Cela change la manière de valider : au lieu de “colonne 7”, vous vérifiez “email” ou “montant”. Et quand un partenaire ajoute une colonne au fichier CSV, votre code reste souvent stable tant que les champs attendus existent.

Avantages d’une lecture en dictionnaire pour un accès intuitif et sécurisé aux colonnes

Le premier avantage est la clarté : row[« client »] est plus parlant que row[1]. Le deuxième est la robustesse : si l’ordre des colonnes change, DictReader continue à fonctionner. Le troisième est la gestion des champs manquants : vous pouvez utiliser get() pour éviter une exception et tracer une ligne incomplète.

Exemple : l’équipe de Lina reçoit un fichier d’adresses, parfois avec “code_postal” vide. Avec DictReader, on traite proprement la valeur absente, et on journalise la ligne fautive. Au final, cette approche rapproche le CSV d’un modèle de données explicite.

import csv

with open("clients.csv", "r", encoding="utf-8-sig", newline="") as f:
    r = csv.DictReader(f, delimiter=";")
    for row in r:
        email = row.get("email", "").strip()
        if not email:
            print("Email manquant à la ligne", r.line_num)

Notez que DictReader reste un reader : il itère et expose line_num. Ce point facilite le support quand un fichier CSV “casse” chez un utilisateur métier.

Découvrez comment lire un fichier CSV en Python grâce à notre guide étape par étape, simple et complet, idéal pour débutants et développeurs.

Écriture de fichiers CSV en Python : csv.writer() et csv.DictWriter() expliqués

Après la lecture vient souvent la production d’un export : un CSV nettoyé, agrégé, ou prêt pour Excel. Avec csv.writer(), vous écrivez des lignes à partir de listes ; avec DictWriter, vous écrivez depuis des dictionnaires. Le duo writer / DictWriter rend l’échange bidirectionnel : importer un fichier, transformer les données, réexporter un fichier CSV fiable.

Les objets writer exposent writerow() (une ligne) et writerows() (plusieurs). C’est simple, mais ce sont des primitives solides : combinées à un dialecte, elles garantissent une sortie conforme, y compris quand des champs contiennent des séparateurs ou des retours à la ligne. Le point clé : un bon writer évite les CSV “illlisibles” à l’import.

Écrire des listes avec csv.writer() et gérer les en-têtes avec csv.DictWriter()

Si vous avez une liste de listes, csv.writer() est direct. Dans le cas de Lina, un script calcule un scoring client et produit un fichier CSV “score_clients.csv” importé ensuite dans Excel. Le writer écrit l’en-tête puis chaque ligne de résultat.

import csv

rows = [
    ["client_id", "score"],
    ["C001", "82"],
    ["C002", "91"],
]

with open("score_clients.csv", "w", encoding="utf-8", newline="") as f:
    w = csv.writer(f, delimiter=",")
    w.writerows(rows)

Quand vos données sont déjà des dictionnaires, DictWriter devient plus sûr : vous fixez fieldnames, donc l’ordre des colonnes, et vous pouvez appeler writeheader(). C’est exactement ce qui évite qu’un fichier change de structure sans que l’équipe s’en rende compte.

import csv

fieldnames = ["client_id", "score"]
with open("score_clients_v2.csv", "w", encoding="utf-8", newline="") as f:
    w = csv.DictWriter(f, fieldnames=fieldnames, delimiter=",")
    w.writeheader()
    w.writerow({"client_id": "C003", "score": 77})

Importance de newline= » en écriture pour éviter les erreurs de format

En sortie, newline= » est tout aussi important : sinon, vous risquez d’obtenir des lignes vides entre chaque enregistrement sur certains systèmes. C’est un problème fréquent quand un fichier CSV est généré par Python puis ouvert dans Excel : l’utilisateur voit des trous, pense que le fichier est corrompu, et la confiance disparaît.

Avec newline= » et un encodage maîtrisé, votre writer produit un CSV stable. Le détail devient une garantie : ce que vous exportez est exactement ce que l’outil avale.

Techniques avancées avec le module csv : détection automatique de format et gestion des erreurs

Dans la vraie vie, les CSV ne sont pas toujours propres. Un fichier peut arriver avec un delimiter inattendu, des guillemets mal fermés, ou un encodage exotique. Le bon réflexe est d’outiller votre pipeline : détecter, valider, et gérer les erreurs sans bloquer toute la chaîne. C’est là que csv.Sniffer et l’exception csv.Error entrent en scène.

Utiliser la classe Sniffer() pour détecter le dialecte d’un fichier CSV inconnu

Sniffer() inspecte un extrait de texte et propose un dialecte probable : delimiter, quotechar, etc. Pour Lina, c’est utile quand un fournisseur change son export sans prévenir : le script tente une détection, puis crée un reader avec le dialecte trouvé. La détection n’est pas magique, mais elle couvre de nombreux cas et réduit les interventions manuelles.

import csv

with open("import_inconnu.csv", "r", encoding="utf-8", newline="") as f:
    sample = f.read(4096)
    f.seek(0)
    dialect = csv.Sniffer().sniff(sample)
    r = csv.reader(f, dialect=dialect)
    for row in r:
        pass

Ce mécanisme est particulièrement pratique quand un fichier CSV a été “touché” dans Excel, puis réexporté avec un séparateur différent. L’insight : automatiser la détection évite les scripts fragiles dépendants d’une hypothèse unique.

Quizz interactif Python & CSV Débogage

Déboguer un fichier CSV en Python — mini-quiz

Teste tes réflexes sur open(), delimiter, DictReader et la gestion des erreurs du module csv.

Q
Question 1 / 5
Choisis une réponse, puis valide.
Score: 0 / 5
Question

Choix de réponse
Astuce clavier: 1–3 pour choisir, Entrée pour valider
Accessibilité

Les retours (correct/incorrect) sont annoncés via une zone aria-live. La navigation clavier est supportée.

Traiter les erreurs courantes liées aux délimiteurs, guillemets et encodages avec csv.Error

Les erreurs typiques : guillemets non fermés, champs contenant un séparateur sans citation, ou mélange de formats. Dans ces cas, csv peut lever csv.Error pendant la lecture. La bonne pratique consiste à entourer la boucle du reader d’un try/except, puis à journaliser la ligne incriminée via line_num, afin de corriger le fichier source ou d’appliquer une stratégie de nettoyage.

L’encodage est l’autre grande famille de problèmes. Un fichier CSV avec accents peut échouer si vous supposez UTF-8 alors qu’il est en Windows-1252. Dans un workflow robuste, vous testez un encodage connu, puis vous basculez vers une alternative si nécessaire, tout en gardant une trace du choix. Ce qui compte : éviter qu’un seul fichier “bizarre” mette à l’arrêt tout le traitement.

Symptôme

Cause fréquente

Piste de correction

Colonnes décalées

Mauvais delimiter

Configurer reader avec delimiter adapté ou Sniffer

Erreur de guillemets

Valeur avec séparateur non citée

Ajuster quoting/quotechar, nettoyer la ligne source

Caractères illisibles

Mauvais encodage

Tester utf-8-sig, cp1252, documenter la source

Lignes vides à l’ouverture

newline mal géré en sortie

Utiliser newline= » avec writer

Pandas et CSV en Python : simplifier et optimiser la lecture et écriture de données tabulaires

Quand la transformation devient plus analytique (filtres, agrégations, jointures), pandas est souvent le chemin le plus court. Là où csv fournit un reader bas niveau et un writer précis, pandas propose une couche plus expressive : on charge un CSV dans un DataFrame, on manipule, puis on réexporte en CSV. Pour Lina, c’est ce qui permet de passer d’un simple import à un nettoyage complet en quelques lignes.

Lecture rapide avec pd.read_csv() et export facile avec df.to_csv()

Avec pandas, la lecture d’un fichier CSV se fait via read_csv(), qui gère un grand nombre d’options : séparateur, types, dates, valeurs manquantes. Puis to_csv() écrit un fichier de sortie. Ce duo devient très efficace quand vous devez normaliser des données avant envoi à un partenaire ou avant import dans Excel.

import pandas as pd

df = pd.read_csv("ventes.csv", sep=",", encoding="utf-8")
df["montant"] = df["montant"].fillna(0).astype(float)
df.to_csv("ventes_nettoyees.csv", index=False, encoding="utf-8")

On gagne en concision, mais il faut rester attentif au format final : si le destinataire attend un delimiter “;”, on le spécifie dans to_csv. L’insight : pandas accélère, mais le contrat de format du CSV reste central.

Gérer les encodages et les données manquantes avec pandas

pandas facilite la gestion des valeurs manquantes : NaN, champs vides, marqueurs “N/A”. Dans un DataFrame, vous pouvez décider d’un standard (zéro, chaîne vide, médiane) et l’appliquer de manière homogène. Pour l’encodage, read_csv et to_csv acceptent encoding, ce qui évite d’ouvrir le fichier manuellement dans certains cas.

Un cas courant chez Lina : un fichier CSV exporté depuis Excel contient des noms avec accents et des cellules vides. En fixant encoding et en traitant fillna, on évite des erreurs silencieuses dans les calculs. Le résultat : des données plus fiables et des tableaux de bord cohérents.

Bonnes pratiques pandas pour manipuler des fichiers CSV volumineux et nettoyer les données

Pour les gros volumes, l’option chunksize de pandas permet de lire un fichier CSV par morceaux, sans saturer la mémoire. Vous traitez chunk par chunk, puis vous réécrivez vers un CSV cible. Cela se combine bien avec des règles de nettoyage : strip() sur des colonnes texte, conversion explicite de types, suppression de doublons.

Voici une approche utile quand Lina reçoit un fichier de logs de plusieurs gigas : lecture en chunks, normalisation, puis export. Le point à retenir : on garde l’ergonomie de pandas sans perdre le contrôle sur les ressources.

  • Fixer systématiquement le séparateur attendu (sep) et l’encodage pour stabiliser les échanges de CSV avec Excel et les systèmes tiers.

  • Nettoyer les chaînes (strip), convertir les types (to_numeric, astype), et contrôler les doublons avant de produire un fichier CSV final.

  • Pour un fichier volumineux, utiliser chunksize, puis concaténer ou écrire au fil de l’eau afin d’éviter les blocages.

Quand vous devez revenir à une logique “streaming” (traiter une ligne à la fois), csv redevient pertinent avec un reader léger ; quand vous devez explorer, croiser et profiler, pandas est souvent imbattable. Cette complémentarité est le vrai levier de productivité sur les CSV.

Pourquoi open() avec newline= » est-il recommandé pour un fichier CSV ?

Parce que le module csv gère lui-même les retours à la ligne. Sans newline= », vous pouvez obtenir des lignes vides ou des séparations incorrectes selon le système, ce qui perturbe le reader et peut rendre le fichier CSV difficile à relire.

Comment choisir entre csv.reader et DictReader ?

Utilisez reader si vous voulez une liste simple et rapide et que l’ordre des colonnes est garanti. Choisissez DictReader si le fichier CSV a une ligne d’en-tête et que vous voulez accéder aux données par nom de colonne, ce qui rend le code plus clair et plus robuste.

Quel encodage utiliser pour un CSV exporté depuis Excel avec des accents ?

Souvent utf-8 ou utf-8-sig (si présence d’un BOM). Si des caractères sont illisibles, testez cp1252. L’important est de fixer explicitement l’encodage à l’ouverture du fichier ou dans pandas (read_csv/to_csv) pour stabiliser la lecture.

Comment gérer un fichier CSV dont le delimiter est inconnu ?

L’approche pratique consiste à lire un extrait et à utiliser csv.Sniffer().sniff() pour déduire un dialecte, puis à créer un reader avec ce dialecte. Ensuite, validez sur quelques lignes que les colonnes sont correctement séparées.

Quand préférer pandas au module csv pour travailler avec des CSV ?

Préférez pandas quand vous devez nettoyer, filtrer, agréger, joindre des données, ou gérer des volumes importants avec chunksize. Le module csv reste idéal pour du streaming ligne à ligne, un contrôle fin du format, ou des scripts légers avec un writer très maîtrisé.

Laisser un commentaire