HOWTO · Python
Lire un CSV avec son en-tête en Python
Apprenez à lire un CSV avec son en-tête en Python.
Sur cette page
Le module csv de la bibliothèque standard de Python permet de lire un fichier séparé par des virgules ligne par ligne. Un fichier CSV stocke souvent les noms des colonnes sur sa première ligne, suivis des enregistrements. Les exemples partent de cette structure ; csv.reader ne traite pas automatiquement la première ligne comme un en-tête. Il renvoie un itérable de lignes, chacune représentée par une liste de chaînes.
Les exemples créent eux-mêmes un petit fichier d’entrée : vous pouvez donc les exécuter sans télécharger de fichier complémentaire. Pour un fichier réel, remplacez la création du fichier temporaire par son chemin et ouvrez-le avec newline="" et un encodage adapté. Vous pouvez aussi consulter le fichier CSV d’exemple contenant des adresses e-mail. La sortie qui suit chaque exemple en montre le résultat.
Lire un fichier CSV avec son en-tête en Python
Transmettez un fichier texte ouvert à csv.reader, puis parcourez le résultat. La boucle inclut toutes les lignes : la première liste affichée correspond donc aux noms des colonnes. Cette méthode est utile pour examiner les enregistrements bruts avant de traiter l’en-tête séparément.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import csv
import tempfile
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
source.write("name,team\nAda,Research\nLin,Design\n")
path = source.name
with open(path, encoding="utf-8", newline="") as source:
rows = csv.reader(source)
for row in rows:
print(row)
Sortie :
['name', 'team']
['Ada', 'Research']
['Lin', 'Design']
Le lecteur analyse les champs selon les règles de citation du format CSV. Découper manuellement chaque ligne sur les virgules peut produire un résultat incorrect si un champ contient une virgule entre guillemets. Le parcours lit le fichier en une seule passe : le temps de traitement augmente donc de façon linéaire avec la taille de l’entrée. Même pour un fichier volumineux, cette méthode n’oblige pas à conserver toutes les lignes en mémoire.
Extraire l’en-tête et traiter les lignes séparément
Appelez la fonction intégrée next() sur le lecteur pour consommer sa première ligne et la stocker comme en-tête. Le lecteur reprend ensuite à la ligne suivante ; la boucle ne traite ainsi que les enregistrements de données. Les noms des colonnes sont séparés de leurs valeurs sans qu’il soit nécessaire de charger tout le fichier dans une liste.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import csv
import tempfile
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
source.write("name,team\nAda,Research\nLin,Design\n")
path = source.name
with open(path, encoding="utf-8", newline="") as source:
rows = csv.reader(source)
header = next(rows)
print("Header:", ", ".join(header))
for row in rows:
print(dict(zip(header, row)))
Sortie :
Header: name, team
{'name': 'Ada', 'team': 'Research'}
{'name': 'Lin', 'team': 'Design'}
Dans la sortie, le libellé « Header: » reste en anglais ; il précède les noms des colonnes. zip associe chaque nom de colonne au champ correspondant, et dict rend ces paires accessibles par leur nom. Cette méthode suppose que le fichier comporte une ligne d’en-tête et que les champs des enregistrements suivent le même ordre. Si le fichier peut être vide, vérifiez qu’il contient une première ligne avant de l’utiliser comme en-tête ; sinon, next() n’a aucune ligne à renvoyer.
Lire un CSV avec un delimiter différent
La virgule est le séparateur par défaut. Pour un fichier utilisant des points-virgules, transmettez l’argument delimiter à csv.reader ; choisissez le caractère qui sépare réellement les champs dans votre fichier. Le lecteur se comporte de la même façon, mais le traitement de l’en-tête reste explicite : par convention, la première ligne contient l’en-tête ; csv.reader ne l’interprète pas comme tel. Cet exemple la consomme donc avec next() avant d’afficher les enregistrements.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import csv
import tempfile
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
source.write("name;team\nAda;Research\nLin;Design\n")
path = source.name
with open(path, encoding="utf-8", newline="") as source:
rows = csv.reader(source, delimiter=";")
header = next(rows)
print("Header:", ", ".join(header))
for row in rows:
print(", ".join(row))
Sortie :
Header: name, team
Ada, Research
Lin, Design
Dans la sortie, le libellé « Header: » reste en anglais ; il introduit les noms des colonnes. Pour d’autres formats, définissez delimiter sur le séparateur utilisé dans le fichier, par exemple une tabulation. Lorsque vous ouvrez un fichier destiné au module CSV, conservez newline="" et choisissez un encodage adapté aux données sources. Si les lignes contiennent des champs entre guillemets ou des retours à la ligne intégrés, laissez csv.reader les analyser au lieu de prétraiter vous-même les lignes.