- À propos de l'ajout de données à un fichier CSV existant en Python
- Comprendre le mode ajout "a" de open()
- Ajouter une ligne avec csv.writer() et writerow()
- Ajouter plusieurs lignes avec writerows()
- Ajouter des données avec csv.DictWriter()
- Ajouter l'en-tête uniquement si le fichier est vide
- Ajouter des données dans un fichier utilisant un point-virgule
- Vérifier les données avant de les ajouter
- Créer une fonction pour ajouter des données à un fichier CSV
- À retenir !
1. À propos de l'ajout de données à un fichier CSV existant en Python
Dans de nombreuses applications Python, il est nécessaire d'ajouter des données à un fichier CSV existant sans supprimer les informations déjà enregistrées. Il peut s'agir, par exemple, d'ajouter un étudiant, un produit, une commande ou une nouvelle mesure à un fichier contenant déjà plusieurs lignes.
Le module standard csv de Python permet de réaliser facilement cette opération. Le principe consiste principalement à ouvrir le fichier avec le mode ajout représenté par la lettre "a", puis à utiliser csv.writer() ou csv.DictWriter() pour écrire les nouvelles données.
Considérons dans ce tutoriel un fichier nommé etudiants.csv possédant initialement le contenu suivant.
1 2 3 4 | nom,age,ville,note Amine,21,Oujda,15.5 Sara,20,Rabat,17 Yassine,22,Fès,13.5 |
Sortie :
1 | Le fichier contient une ligne d'en-tête et trois étudiants. |
Nous pouvons vérifier son contenu avec Python avant d'effectuer une modification.
1 2 | with open("etudiants.csv", "r", encoding="utf-8") as fichier: print(fichier.read()) |
Sortie :
1 2 3 4 | nom,age,ville,note Amine,21,Oujda,15.5 Sara,20,Rabat,17 Yassine,22,Fès,13.5 |
Notre objectif consiste à ajouter de nouvelles lignes à la fin de ce fichier tout en conservant les données existantes.
2. Comprendre le mode ajout "a" de open()
La fonction open() accepte différents modes d'ouverture. Le mode "w" est utilisé pour écrire dans un fichier en remplaçant son contenu, tandis que le mode "a", pour append, permet d'ajouter des données à la fin du fichier.
Le programme suivant ouvre etudiants.csv en mode ajout et écrit directement une nouvelle ligne de texte à la fin du fichier.
1 2 3 4 | with open("etudiants.csv", "a", encoding="utf-8") as fichier: fichier.write("Lina,19,Casablanca,18\n") print("Nouvelle ligne ajoutée.") |
Sortie :
1 | Nouvelle ligne ajoutée. |
Le fichier contient maintenant quatre étudiants.
1 2 3 4 5 | nom,age,ville,note Amine,21,Oujda,15.5 Sara,20,Rabat,17 Yassine,22,Fès,13.5 Lina,19,Casablanca,18 |
Sortie :
1 | La nouvelle ligne a été ajoutée après les données existantes. |
Pour manipuler correctement des fichiers CSV, il est cependant préférable d'utiliser le module csv plutôt que de construire manuellement les lignes avec fichier.write(). Cela permet notamment de mieux gérer les séparateurs, les guillemets et les champs contenant des caractères particuliers.
3. Ajouter une ligne avec csv.writer() et writerow()
La méthode la plus classique consiste à créer un objet csv.writer() puis à utiliser sa méthode writerow(). Le fichier est ouvert avec le mode "a" afin que les données précédentes soient conservées.
Le paramètre newline="" est recommandé lors de l'utilisation du module csv afin de laisser ce module gérer correctement les fins de ligne.
1 2 3 4 5 6 7 8 9 | import csv nouvel_etudiant = ["Omar", 20, "Agadir", 14.5] with open("etudiants.csv", "a", encoding="utf-8", newline="") as fichier: writer = csv.writer(fichier) writer.writerow(nouvel_etudiant) print("Étudiant ajouté avec succès.") |
Sortie :
1 | Étudiant ajouté avec succès. |
La nouvelle ligne est placée à la fin du fichier sans modifier les lignes précédentes.
1 2 3 4 5 6 | nom,age,ville,note Amine,21,Oujda,15.5 Sara,20,Rabat,17 Yassine,22,Fès,13.5 Lina,19,Casablanca,18 Omar,20,Agadir,14.5 |
Sortie :
1 | La ligne d'Omar a été ajoutée à la fin du fichier CSV. |
Nous pouvons relire le fichier avec csv.reader() afin de vérifier l'ajout.
1 2 3 4 5 6 7 | import csv with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.reader(fichier) for ligne in lecteur: print(ligne) |
Sortie possible :
1 2 3 4 5 6 | ['nom', 'age', 'ville', 'note'] ['Amine', '21', 'Oujda', '15.5'] ['Sara', '20', 'Rabat', '17'] ['Yassine', '22', 'Fès', '13.5'] ['Lina', '19', 'Casablanca', '18'] ['Omar', '20', 'Agadir', '14.5'] |
4. Ajouter plusieurs lignes avec writerows()
Lorsqu'il faut ajouter plusieurs enregistrements, il n'est pas nécessaire d'appeler writerow() séparément pour chaque ligne. La méthode writerows() permet d'écrire plusieurs lignes à partir d'une liste de listes ou d'une autre collection de séquences.
Le programme suivant ajoute trois étudiants en une seule opération.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import csv nouveaux_etudiants = [ ["Nadia", 23, "Marrakech", 16], ["Samir", 21, "Tanger", 12.5], ["Salma", 20, "Meknès", 17.5] ] with open("etudiants.csv", "a", encoding="utf-8", newline="") as fichier: writer = csv.writer(fichier) writer.writerows(nouveaux_etudiants) print("Nombre de lignes ajoutées :", len(nouveaux_etudiants)) |
Sortie :
1 | Nombre de lignes ajoutées : 3 |
Les trois nouveaux enregistrements apparaissent à la fin du fichier.
1 2 3 | Nadia,23,Marrakech,16 Samir,21,Tanger,12.5 Salma,20,Meknès,17.5 |
Sortie :
1 | Trois nouvelles lignes ont été ajoutées au fichier existant. |
writerow() est donc adaptée à l'ajout d'un seul enregistrement, tandis que writerows() simplifie l'ajout d'un ensemble d'enregistrements.
5. Ajouter des données avec csv.DictWriter()
Lorsque le fichier possède des noms de colonnes, nous pouvons utiliser csv.DictWriter(). Cette classe permet de représenter chaque nouvel enregistrement sous forme de dictionnaire Python.
Le programme suivant ajoute un étudiant au fichier en utilisant les clés nom, age, ville et note.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import csv colonnes = ["nom", "age", "ville", "note"] etudiant = { "nom": "Karim", "age": 22, "ville": "Oujda", "note": 16.5 } with open("etudiants.csv", "a", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writerow(etudiant) print("Étudiant ajouté avec DictWriter().") |
Sortie :
1 | Étudiant ajouté avec DictWriter(). |
Le dictionnaire est automatiquement transformé en une ligne respectant l'ordre défini par fieldnames.
1 | Karim,22,Oujda,16.5 |
Sortie :
1 | Les valeurs du dictionnaire ont été placées dans les colonnes correspondantes. |
Plusieurs dictionnaires peuvent également être ajoutés avec writerows().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import csv colonnes = ["nom", "age", "ville", "note"] etudiants = [ {"nom": "Ali", "age": 19, "ville": "Oujda", "note": 14}, {"nom": "Imane", "age": 21, "ville": "Rabat", "note": 18} ] with open("etudiants.csv", "a", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writerows(etudiants) print("Nombre d'étudiants ajoutés :", len(etudiants)) |
Sortie :
1 | Nombre d'étudiants ajoutés : 2 |
6. Ajouter l'en-tête uniquement si le fichier est vide
Le mode "a" possède une particularité importante : si le fichier n'existe pas encore, Python le crée automatiquement. Dans ce cas, il peut être nécessaire d'écrire également la ligne d'en-tête.
En revanche, si le fichier contient déjà des données, il ne faut pas réécrire l'en-tête à chaque ajout. Nous pouvons utiliser os.path.getsize() pour déterminer si le fichier est vide.
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 | import csv import os nom_fichier = "etudiants.csv" colonnes = ["nom", "age", "ville", "note"] etudiant = { "nom": "Hajar", "age": 20, "ville": "Fès", "note": 15 } fichier_vide = ( not os.path.exists(nom_fichier) or os.path.getsize(nom_fichier) == 0 ) with open(nom_fichier, "a", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) if fichier_vide: writer.writeheader() writer.writerow(etudiant) print("Données ajoutées.") print("En-tête créé :", fichier_vide) |
Sortie possible si le fichier existe déjà :
1 2 | Données ajoutées. En-tête créé : False |
Si le fichier n'existe pas encore ou s'il est vide, le même programme produit un fichier correctement structuré.
1 2 | nom,age,ville,note Hajar,20,Fès,15 |
Sortie :
1 | L'en-tête est écrit une seule fois avant la première ligne de données. |
Cette technique est particulièrement utile pour les programmes qui enregistrent progressivement de nouvelles informations dans un fichier CSV.
7. Ajouter des données dans un fichier utilisant un point-virgule
Un fichier CSV peut utiliser un autre séparateur que la virgule. Le point-virgule est fréquent dans les fichiers provenant de certains tableurs. Le paramètre delimiter permet d'indiquer le séparateur à utiliser.
Considérons un fichier produits.csv utilisant le point-virgule.
1 2 3 | produit;prix;stock Clavier;25.90;12 Souris;15.50;30 |
Sortie :
1 | Le fichier contient trois colonnes séparées par des points-virgules. |
Pour ajouter un nouveau produit, nous utilisons delimiter=";" avec csv.writer().
1 2 3 4 5 6 7 8 9 | import csv nouveau_produit = ["Écran", 189.00, 8] with open("produits.csv", "a", encoding="utf-8", newline="") as fichier: writer = csv.writer(fichier, delimiter=";") writer.writerow(nouveau_produit) print("Produit ajouté.") |
Sortie :
1 | Produit ajouté. |
Le fichier contient désormais la nouvelle ligne avec le même séparateur que les lignes précédentes.
1 2 3 4 | produit;prix;stock Clavier;25.90;12 Souris;15.50;30 Écran;189.0;8 |
Sortie :
1 | Le nouveau produit a été ajouté avec le séparateur ; |
Lors de l'ajout à un fichier existant, il est important d'utiliser le même dialecte CSV, notamment le même séparateur et les mêmes conventions de citation que celles utilisées lors de la création du fichier.
8. Vérifier les données avant de les ajouter
Avant d'ajouter une ligne à un fichier CSV, il peut être utile de valider les données. Cette vérification permet notamment d'éviter les âges invalides, les notes incorrectes ou les enregistrements incomplets.
Le programme suivant vérifie qu'un étudiant possède un nom, que son âge est positif et que sa note est comprise entre 0 et 20.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | def etudiant_valide(etudiant): if not etudiant["nom"].strip(): return False if etudiant["age"] <= 0: return False if not 0 <= etudiant["note"] <= 20: return False return True etudiant = { "nom": "Nora", "age": 21, "ville": "Oujda", "note": 17.5 } print("Données valides :", etudiant_valide(etudiant)) |
Sortie :
1 | Données valides : True |
Nous pouvons alors conditionner l'écriture dans le fichier au résultat de cette vérification.
1 2 3 4 5 6 7 8 9 10 11 12 | import csv colonnes = ["nom", "age", "ville", "note"] if etudiant_valide(etudiant): with open("etudiants.csv", "a", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writerow(etudiant) print("Étudiant ajouté.") else: print("Données incorrectes : ajout annulé.") |
Sortie :
1 | Étudiant ajouté. |
Une autre vérification fréquente consiste à éviter l'ajout d'un doublon. Dans l'exemple suivant, nous considérons qu'un étudiant existe déjà si son nom est présent dans le fichier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import csv nom_recherche = "Amine" existe = False with open("etudiants.csv", "r", encoding="utf-8", newline="") as fichier: lecteur = csv.DictReader(fichier) for etudiant in lecteur: if etudiant["nom"] == nom_recherche: existe = True break print("Étudiant déjà présent :", existe) |
Sortie :
1 | Étudiant déjà présent : True |
Dans une application réelle, il est préférable d'utiliser un identifiant unique plutôt qu'un nom pour détecter les doublons.
9. Créer une fonction pour ajouter des données à un fichier CSV
Lorsque l'ajout de données est effectué régulièrement, il est préférable de regrouper le traitement dans une fonction réutilisable. La fonction suivante ajoute un dictionnaire dans un fichier CSV et crée automatiquement l'en-tête lorsque le fichier est nouveau ou vide.
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 | import csv import os def ajouter_etudiant(nom_fichier, etudiant): colonnes = ["nom", "age", "ville", "note"] fichier_vide = ( not os.path.exists(nom_fichier) or os.path.getsize(nom_fichier) == 0 ) with open( nom_fichier, "a", encoding="utf-8", newline="" ) as fichier: writer = csv.DictWriter( fichier, fieldnames=colonnes ) if fichier_vide: writer.writeheader() writer.writerow(etudiant) print(etudiant["nom"], "a été ajouté.") ajouter_etudiant( "etudiants.csv", { "nom": "Meryem", "age": 20, "ville": "Oujda", "note": 18 } ) |
Sortie :
1 | Meryem a été ajouté. |
La même fonction peut être appelée plusieurs fois pour ajouter successivement plusieurs étudiants.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ajouter_etudiant( "etudiants.csv", { "nom": "Anas", "age": 22, "ville": "Rabat", "note": 16 } ) ajouter_etudiant( "etudiants.csv", { "nom": "Sofia", "age": 19, "ville": "Tanger", "note": 17 } ) |
Sortie :
1 2 | Anas a été ajouté. Sofia a été ajouté. |
Cette approche centralise la logique d'écriture et évite de répéter le même code dans différentes parties du programme.
10. À retenir !
Pour ajouter des données à un fichier CSV existant sans supprimer son contenu, il faut généralement ouvrir le fichier en mode "a". Le module csv fournit ensuite plusieurs méthodes permettant d'ajouter une ou plusieurs lignes.
- Le mode "a" permet d'ajouter des données à la fin d'un fichier.
- Contrairement au mode "w", le mode "a" ne remplace pas le contenu existant.
- Si le fichier n'existe pas, le mode "a" permet généralement de le créer.
- csv.writer() permet d'ajouter des données représentées par des listes ou des séquences.
- writerow() ajoute une seule ligne.
- writerows() permet d'ajouter plusieurs lignes.
- csv.DictWriter() permet d'écrire des données représentées par des dictionnaires.
- Avec un fichier existant possédant déjà un en-tête, il ne faut pas appeler writeheader() à chaque ajout.
- Pour un fichier nouveau ou vide, writeheader() permet de créer automatiquement la ligne d'en-tête.
- Le paramètre newline="" est recommandé lors de l'ouverture des fichiers utilisés avec le module csv.
- Le paramètre delimiter permet de respecter le séparateur utilisé par le fichier existant.
- Il est conseillé de valider les données avant leur ajout et, si nécessaire, de contrôler les doublons.
Le modèle suivant résume l'ajout classique d'une ligne dans un fichier CSV existant avec csv.writer().
1 2 3 4 5 6 7 8 9 | import csv nouvelle_ligne = ["Nadia", 21, "Oujda", 17] with open("etudiants.csv", "a", encoding="utf-8", newline="") as fichier: writer = csv.writer(fichier) writer.writerow(nouvelle_ligne) print("Nouvelle ligne ajoutée.") |
Sortie :
1 | Nouvelle ligne ajoutée. |
Lorsque les données sont organisées sous forme de dictionnaires, nous pouvons utiliser DictWriter().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import csv colonnes = ["nom", "age", "ville", "note"] nouvel_etudiant = { "nom": "Salma", "age": 20, "ville": "Rabat", "note": 18 } with open("etudiants.csv", "a", encoding="utf-8", newline="") as fichier: writer = csv.DictWriter(fichier, fieldnames=colonnes) writer.writerow(nouvel_etudiant) print("Dictionnaire ajouté au fichier CSV.") |
Sortie :
1 | Dictionnaire ajouté au fichier CSV. |
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/


