HOWTO · Python
Lire CSV ligne par ligne en Python
Cet article explique comment lire un fichier CSV ligne par ligne en Python.
Sur cette page
Utilisez le module standard csv de Python pour traiter un fichier CSV en parcourant ses enregistrements un à un. csv.reader renvoie chaque enregistrement sous forme de liste, tandis que csv.DictReader utilise les champs de l’en-tête comme clés de dictionnaire. Les exemples ci-dessous créent leur propre fichier de démonstration : vous pouvez les exécuter tels quels, puis remplacer cette préparation par le chemin de votre fichier pour les adapter.
Préparer un fichier CSV pour les exemples
Un enregistrement CSV est une ligne de champs, souvent séparés par des virgules. L’en-tête est un premier enregistrement facultatif qui indique le nom des champs. Les fichiers CSV peuvent aussi contenir des champs entre guillemets, par exemple un nom comportant une virgule. Utilisez donc le module csv de Python au lieu de découper vous-même chaque ligne sur les virgules.
Vous pouvez créer un fichier dans un tableur ou dans un éditeur de texte brut comme le Bloc-notes. Pour cet exemple, le contenu est Roll Number,Name,Subject, suivi de 1,Harry Potter,Magical Creatures, 2,Ron Weasley,Divination et 3,Hermione Granger,Dark arts. Enregistrez un contenu équivalent sous le nom Demo.csv si vous souhaitez suivre l’exemple avec un fichier sur disque.
Lire chaque ligne CSV avec csv.reader
csv.reader est utile lorsque la position des champs compte. Il renvoie chaque enregistrement sous forme de liste de chaînes, y compris l’en-tête s’il y en a un. Le parcours du lecteur traite les enregistrements au fur et à mesure ; cela ne garantit pas qu’une seule ligne physique se trouve en mémoire, car la mise en tampon et les champs entre guillemets répartis sur plusieurs lignes peuvent influer sur la lecture.
Exécutez cet exemple. Le code et les libellés de sortie restent en anglais.
import csv
import os
import tempfile
rows = [
["Roll Number", "Name", "Subject"],
["1", "Harry Potter", "Magical Creatures"],
["2", "Ron Weasley", "Divination"],
["3", "Hermione Granger", "Dark arts"],
]
path = ""
try:
with tempfile.NamedTemporaryFile("w", newline="", encoding="utf-8", delete=False) as file:
path = file.name
csv.writer(file).writerows(rows)
with open(path, newline="", encoding="utf-8") as file:
for row in csv.reader(file):
print(row)
finally:
if path and os.path.exists(path):
os.remove(path)
['Roll Number', 'Name', 'Subject']
['1', 'Harry Potter', 'Magical Creatures']
['2', 'Ron Weasley', 'Divination']
['3', 'Hermione Granger', 'Dark arts']
L’instruction with ferme le fichier à la fin du parcours, y compris si le traitement s’arrête plus tôt. Lorsque vous ouvrez un fichier pour le module csv, utilisez newline="" et indiquez un encodage comme UTF-8 afin que le texte soit décodé de manière cohérente. Le mode de open() est "r" par défaut ; utilisez "w" pour créer un fichier, comme dans la préparation de l’exemple.
Ignorer l’en-tête et gérer un fichier vide
Lorsque le premier enregistrement contient les noms des colonnes, appelez la fonction intégrée next() avec une valeur par défaut pour le consommer sans risque. next(reader, None) renvoie None s’il n’y a pas de premier enregistrement ; la boucle ne s’exécute donc que si un en-tête a été trouvé. Un fichier vide et un fichier contenant uniquement l’en-tête ne produisent aucune ligne de données.
L’exemple exécutable ci-dessous montre un fichier avec en-tête et un fichier vide. Le code et les libellés de sortie restent en anglais.
import csv
import os
import tempfile
def data_rows(content):
path = ""
try:
with tempfile.NamedTemporaryFile("w", newline="", encoding="utf-8", delete=False) as file:
path = file.name
file.write(content)
with open(path, newline="", encoding="utf-8") as file:
reader = csv.reader(file)
header = next(reader, None)
return list(reader) if header is not None else []
finally:
if path and os.path.exists(path):
os.remove(path)
print(data_rows("Name,Subject\nHarry Potter,Magical Creatures\n"))
print(data_rows(""))
[['Harry Potter', 'Magical Creatures']]
[]
La valeur par défaut facultative est importante : appelé sans elle, next(reader) n’a aucune valeur à renvoyer si le fichier est vide. Si votre fichier ne comporte pas d’en-tête, ne consommez pas le premier enregistrement ; parcourez directement le lecteur comme dans l’exemple précédent.
Lire les lignes sous forme de dictionnaires avec csv.DictReader
Choisissez csv.DictReader lorsque les noms des champs sont plus clairs que leurs positions numériques. Par défaut, il traite le premier enregistrement comme l’en-tête et associe chaque enregistrement suivant à un dictionnaire. Les valeurs restent des chaînes : convertissez explicitement une valeur si vous avez besoin d’un nombre. Le code et les libellés de sortie de l’exemple restent en anglais.
import csv
import os
import tempfile
content = (
"Roll Number,Name,Subject\n"
"1,Harry Potter,Magical Creatures\n"
"2,Ron Weasley,Divination\n"
"3,Hermione Granger,Dark arts\n"
)
path = ""
try:
with tempfile.NamedTemporaryFile("w", newline="", encoding="utf-8", delete=False) as file:
path = file.name
file.write(content)
with open(path, newline="", encoding="utf-8") as file:
for row in csv.DictReader(file):
print(row)
finally:
if path and os.path.exists(path):
os.remove(path)
{'Roll Number': '1', 'Name': 'Harry Potter', 'Subject': 'Magical Creatures'}
{'Roll Number': '2', 'Name': 'Ron Weasley', 'Subject': 'Divination'}
{'Roll Number': '3', 'Name': 'Hermione Granger', 'Subject': 'Dark arts'}
Par exemple, vous pouvez accéder à une ligne avec row["Name"]. DictReader utilise les valeurs de l’en-tête comme clés ; si le fichier n’a pas d’en-tête, indiquez les noms des champs avec l’argument fieldnames au lieu de laisser le premier enregistrement de données servir d’en-tête.
Choisir entre les listes de lignes et les dictionnaires
Utilisez csv.reader si vous souhaitez des listes compactes et connaissez la position de chaque champ, par exemple row[0] pour la première colonne. Choisissez csv.DictReader si des noms comme row["Subject"] rendent le code plus facile à comprendre ou à maintenir. Les deux lecteurs parcourent les enregistrements, et les champs restent des chaînes tant que votre code ne les convertit pas. Pour les fichiers volumineux, traitez chaque ligne renvoyée dans la boucle au lieu de rassembler toutes les lignes dans une liste.