- À propos de la modification d'une ligne dans un fichier CSV en Python
- Comprendre le principe de modification d'un fichier CSV
- Modifier une ligne avec csv.reader() et csv.writer()
- Modifier une ligne avec csv.DictReader() et csv.DictWriter()
- Modifier une ligne à partir d'un identifiant
- Modifier plusieurs colonnes d'une même ligne
- Modifier toutes les lignes répondant à une condition
- Modifier un fichier CSV à l'aide d'un fichier temporaire
- Créer une fonction pour modifier une ligne d'un fichier CSV
- À retenir !
1. À propos de la modification d'une ligne dans un fichier CSV en Python
La modification d'une ligne dans un fichier CSV est une opération courante lorsqu'une application doit mettre à jour une information déjà enregistrée : modifier la note d'un étudiant, changer son adresse, mettre à jour le prix d'un produit ou corriger une donnée erronée.
Contrairement à une base de données, un fichier CSV ne fournit pas directement une instruction permettant de modifier une ligne particulière sur place. La méthode habituelle consiste à lire les données, rechercher la ligne à modifier, changer les valeurs souhaitées puis réécrire le fichier CSV.
Le module standard csv fournit notamment csv.reader(), csv.writer(), csv.DictReader() et csv.DictWriter() pour réaliser ces opérations.
Le programme suivant illustre simplement le principe de modification d'une donnée représentée par un dictionnaire Python.
1 2 3 4 5 6 7 8 9 10 11 | etudiant = { "id": "2", "nom": "Sara", "age": "20", "ville": "Rabat", "note": "17" } etudiant["note"] = "18.5" print(etudiant) |
Sortie :
1 | {'id': '2', 'nom': 'Sara', 'age': '20', 'ville': 'Rabat', 'note': '18.5'} |
Nous allons appliquer ce principe aux lignes d'un véritable fichier CSV.
2. Comprendre le principe de modification d'un fichier CSV
Considérons un fichier nommé etudiants.csv contenant un identifiant unique ainsi que différentes informations sur les étudiants.
Voici le contenu initial du fichier utilisé dans les exemples.
1 2 3 4 5 6 | id,nom,age,ville,note 1,Amine,21,Oujda,15.5 2,Sara,20,Rabat,17 3,Yassine,22,Fès,13.5 4,Lina,19,Casablanca,18 5,Omar,21,Agadir,14 |
Sortie :
1 | Le fichier contient 5 colonnes et 5 lignes de données. |
Pour modifier une ligne, une méthode simple consiste à charger les lignes dans une liste, effectuer la modification puis ouvrir le fichier en mode "w" afin de réécrire son contenu.
Le programme suivant charge toutes les lignes du fichier sans encore effectuer de modification.
1 2 3 4 5 6 7 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.reader(fichier) lignes = list(lecteur) print("Nombre total de lignes :", len(lignes)) |
Sortie :
1 | Nombre total de lignes : 6 |
Le résultat est égal à 6 parce que la liste contient les cinq étudiants ainsi que la ligne d'en-tête.
Il faut être prudent avec le mode "w" : dès que le fichier est ouvert dans ce mode, son ancien contenu est remplacé. Il est donc préférable d'avoir terminé la lecture et les modifications avant de procéder à la réécriture.
3. Modifier une ligne avec csv.reader() et csv.writer()
Avec csv.reader(), chaque ligne est représentée sous forme de liste. Les colonnes sont donc manipulées à partir de leurs indices. Dans notre fichier, le nom se trouve à l'indice 1 et la note à l'indice 4.
Le programme suivant recherche Sara puis remplace sa note 17 par 18.5.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.reader(fichier) lignes = list(lecteur) for ligne in lignes: if ligne[1] == "Sara": ligne[4] = "18.5" break with open("etudiants.csv", "w", encoding="utf-8", newline="") as fichier: writer = csv.writer(fichier) writer.writerows(lignes) print("La note de Sara a été modifiée.") |
Sortie :
1 | La note de Sara a été modifiée. |
Après l'exécution, le fichier contient la nouvelle valeur.
1 2 3 4 5 6 | id,nom,age,ville,note 1,Amine,21,Oujda,15.5 2,Sara,20,Rabat,18.5 3,Yassine,22,Fès,13.5 4,Lina,19,Casablanca,18 5,Omar,21,Agadir,14 |
Sortie :
1 | La ligne de Sara contient maintenant la note 18.5. |
Cette technique est simple, mais l'utilisation d'indices comme ligne[1] et ligne[4] devient moins lisible lorsque le fichier possède de nombreuses colonnes. DictReader() permet d'utiliser directement leurs noms.
4. Modifier une ligne avec csv.DictReader() et csv.DictWriter()
La combinaison csv.DictReader() et csv.DictWriter() est particulièrement pratique pour modifier un fichier possédant une ligne d'en-tête. Chaque ligne est représentée sous forme de dictionnaire.
Le programme suivant modifie la ville de Yassine en utilisant directement les clés "nom" et "ville".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) for ligne in lignes: if ligne["nom"] == "Yassine": ligne["ville"] = "Meknès" break with open("etudiants.csv", "w", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writeheader() writer.writerows(lignes) print("Ville de Yassine modifiée.") |
Sortie :
1 | Ville de Yassine modifiée. |
La ligne correspondante devient alors la suivante.
1 | 3,Yassine,22,Meknès,13.5 |
Sortie :
1 | La ville de Yassine est maintenant Meknès. |
L'attribut fieldnames permet ici de récupérer automatiquement les noms des colonnes afin de les transmettre à DictWriter(). L'appel à writeheader() réécrit ensuite l'en-tête du fichier.
5. Modifier une ligne à partir d'un identifiant
Rechercher une ligne à partir du nom n'est pas toujours fiable, car plusieurs personnes peuvent avoir le même nom. Lorsqu'un fichier possède un identifiant unique, il est préférable de l'utiliser pour sélectionner précisément l'enregistrement à modifier.
Le programme suivant recherche l'étudiant dont l'identifiant est égal à 5 puis modifie sa note.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import csv id_recherche = "5" nouvelle_note = "16" with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) modifie = False for ligne in lignes: if ligne["id"] == id_recherche: ligne["note"] = nouvelle_note modifie = True break with open("etudiants.csv", "w", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writeheader() writer.writerows(lignes) if modifie: print("Ligne modifiée avec succès.") else: print("Identifiant introuvable.") |
Sortie :
1 | Ligne modifiée avec succès. |
Nous pouvons relire l'enregistrement afin de vérifier la nouvelle valeur.
1 2 3 4 5 6 7 8 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) for ligne in lecteur: if ligne["id"] == "5": print(ligne) |
Sortie :
1 | {'id': '5', 'nom': 'Omar', 'age': '21', 'ville': 'Agadir', 'note': '16'} |
La variable modifie permet de savoir si l'identifiant recherché a réellement été rencontré avant la réécriture du fichier.
6. Modifier plusieurs colonnes d'une même ligne
Une fois la ligne recherchée trouvée, plusieurs colonnes peuvent être modifiées simultanément. Il suffit de changer plusieurs valeurs du dictionnaire avant de réécrire le fichier.
Le programme suivant recherche l'étudiant d'identifiant 2 puis modifie son âge, sa ville et sa note.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) for ligne in lignes: if ligne["id"] == "2": ligne["age"] = "21" ligne["ville"] = "Casablanca" ligne["note"] = "19" break with open("etudiants.csv", "w", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writeheader() writer.writerows(lignes) print("Informations modifiées.") |
Sortie :
1 | Informations modifiées. |
La ligne modifiée possède maintenant les nouvelles valeurs.
1 | 2,Sara,21,Casablanca,19 |
Sortie :
1 | L'âge, la ville et la note de Sara ont été modifiés. |
Lorsque plusieurs modifications sont stockées dans un dictionnaire, la méthode update() permet d'appliquer les changements plus facilement.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | etudiant = { "id": "2", "nom": "Sara", "age": "20", "ville": "Rabat", "note": "17" } modifications = { "age": "21", "ville": "Casablanca", "note": "19" } etudiant.update(modifications) print(etudiant) |
Sortie :
1 | {'id': '2', 'nom': 'Sara', 'age': '21', 'ville': 'Casablanca', 'note': '19'} |
Cette technique devient particulièrement intéressante lorsque les nouvelles valeurs proviennent d'un formulaire, d'un autre fichier ou d'une interface graphique.
7. Modifier toutes les lignes répondant à une condition
Il n'est pas toujours nécessaire de modifier une seule ligne. Nous pouvons aussi rechercher toutes les lignes répondant à une condition puis appliquer une modification à chacune d'elles.
Le programme suivant ajoute un point à la note de tous les étudiants dont la note est strictement inférieure à 15.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) nombre_modifications = 0 for ligne in lignes: note = float(ligne["note"]) if note < 15: ligne["note"] = str(note + 1) nombre_modifications += 1 with open("etudiants.csv", "w", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writeheader() writer.writerows(lignes) print("Nombre de lignes modifiées :", nombre_modifications) |
Sortie :
1 | Nombre de lignes modifiées : 2 |
Nous pouvons également modifier toutes les lignes partageant une même valeur textuelle. L'exemple suivant remplace la ville Oujda par Oujda-Angad.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) nombre = 0 for ligne in lignes: if ligne["ville"] == "Oujda": ligne["ville"] = "Oujda-Angad" nombre += 1 with open("etudiants.csv", "w", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writeheader() writer.writerows(lignes) print("Nombre de villes modifiées :", nombre) |
Sortie :
1 | Nombre de villes modifiées : 1 |
Dans ce type de traitement, nous n'utilisons pas break, car nous souhaitons continuer à parcourir le fichier afin de modifier toutes les lignes satisfaisant la condition.
8. Modifier un fichier CSV à l'aide d'un fichier temporaire
Pour les fichiers plus volumineux, charger toutes les lignes avec list() peut consommer inutilement de la mémoire. Une autre stratégie consiste à lire le fichier source ligne par ligne et à écrire simultanément les données dans un fichier temporaire.
Une fois l'opération terminée avec succès, os.replace() permet de remplacer le fichier original par le fichier temporaire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import csv import os source = "etudiants.csv" temporaire = "etudiants_temp.csv" with open(source, "r", encoding="utf-8", newline="") as entree: lecteur = csv.DictReader(entree) colonnes = lecteur.fieldnames with open(temporaire, "w", encoding="utf-8", newline="") as sortie: writer = csv.DictWriter(sortie, fieldnames=colonnes) writer.writeheader() for ligne in lecteur: if ligne["id"] == "3": ligne["note"] = "16" writer.writerow(ligne) os.replace(temporaire, source) print("Fichier mis à jour.") |
Sortie :
1 | Fichier mis à jour. |
Nous pouvons ensuite vérifier la ligne d'identifiant 3.
1 2 3 4 5 6 7 8 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) for ligne in lecteur: if ligne["id"] == "3": print(ligne) |
Sortie :
1 | {'id': '3', 'nom': 'Yassine', 'age': '22', 'ville': 'Fès', 'note': '16'} |
Cette méthode évite de conserver toutes les lignes du fichier en mémoire. Elle est donc mieux adaptée lorsque le fichier CSV devient volumineux.
Il est également préférable d'effectuer le remplacement du fichier original seulement après la fermeture correcte des deux fichiers. Ainsi, le fichier source n'est pas ouvert simultanément en lecture et en écriture.
9. Créer une fonction pour modifier une ligne d'un fichier CSV
Lorsque l'opération doit être effectuée régulièrement, il est utile de créer une fonction réutilisable. La fonction suivante recherche une ligne à partir de son identifiant et applique les modifications contenues dans un dictionnaire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import csv def modifier_etudiant(nom_fichier, id_recherche, modifications): with open( nom_fichier, "r", encoding="utf-8", newline="" ) as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) trouve = False for ligne in lignes: if ligne["id"] == str(id_recherche): ligne.update(modifications) trouve = True break if trouve: with open( nom_fichier, "w", encoding="utf-8", newline="" ) as fichier: writer = csv.DictWriter( fichier, fieldnames=colonnes ) writer.writeheader() writer.writerows(lignes) return trouve resultat = modifier_etudiant( "etudiants.csv", 4, { "ville": "Tanger", "note": "19" } ) print("Modification effectuée :", resultat) |
Sortie :
1 | Modification effectuée : True |
La fonction peut maintenant être appelée avec d'autres identifiants et d'autres modifications sans réécrire toute la logique de traitement.
1 2 3 4 5 6 7 8 9 10 11 12 13 | resultat = modifier_etudiant( "etudiants.csv", 1, { "age": "22", "note": "17.5" } ) if resultat: print("Étudiant modifié avec succès.") else: print("Étudiant introuvable.") |
Sortie :
1 | Étudiant modifié avec succès. |
Il est également important de gérer le cas où l'identifiant demandé n'existe pas. La fonction retourne alors False et le fichier n'est pas réécrit.
1 2 3 4 5 6 7 8 9 10 11 12 | resultat = modifier_etudiant( "etudiants.csv", 100, { "note": "20" } ) if resultat: print("Modification terminée.") else: print("Aucune ligne trouvée.") |
Sortie :
1 | Aucune ligne trouvée. |
Cette organisation rend le programme plus lisible et permet de séparer la logique de modification du fichier CSV du reste de l'application.
10. À retenir !
La modification d'une ligne dans un fichier CSV en Python nécessite généralement de lire les données, identifier la ligne concernée, modifier ses valeurs puis réécrire le fichier.
- Un fichier CSV ne se manipule pas comme une base de données permettant naturellement de mettre à jour un enregistrement avec une requête.
- csv.reader() permet de modifier les données en travaillant avec les indices des colonnes.
- csv.DictReader() permet de manipuler les colonnes à partir de leurs noms.
- csv.writer() et csv.DictWriter() permettent de réécrire les données modifiées.
- Le mode "w" remplace le contenu du fichier : les données doivent donc être préparées avant la réécriture.
- Un identifiant unique constitue généralement un meilleur critère de recherche qu'un nom.
- La méthode update() permet de modifier plusieurs champs d'un dictionnaire.
- L'utilisation de break permet d'arrêter la recherche lorsqu'une seule ligne doit être modifiée.
- Pour modifier plusieurs lignes répondant à une condition, il faut continuer à parcourir le fichier sans utiliser break.
- Pour les fichiers volumineux, un fichier temporaire permet de traiter progressivement les lignes sans charger tout le fichier en mémoire.
- os.replace() peut être utilisé après l'écriture pour remplacer le fichier original par le fichier temporaire.
- Une fonction réutilisable facilite la modification de différentes lignes et de différentes colonnes.
Le programme suivant résume la méthode classique utilisant DictReader() et DictWriter() pour modifier une ligne identifiée par son id.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import csv id_recherche = "2" with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) colonnes = lecteur.fieldnames lignes = list(lecteur) for ligne in lignes: if ligne["id"] == id_recherche: ligne["note"] = "18.5" break with open("etudiants.csv", "w", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writeheader() writer.writerows(lignes) print("Modification terminée.") |
Sortie :
1 | Modification terminée. |
Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/


