Ajouter des données à un fichier CSV existant en Python

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.

Sortie :

Nous pouvons vérifier son contenu avec Python avant d'effectuer une modification.

Sortie :

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.

Sortie :

Le fichier contient maintenant quatre étudiants.

Sortie :

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.

Sortie :

La nouvelle ligne est placée à la fin du fichier sans modifier les lignes précédentes.

Sortie :

Nous pouvons relire le fichier avec csv.reader() afin de vérifier l'ajout.

Sortie possible :

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.

Sortie :

Les trois nouveaux enregistrements apparaissent à la fin du fichier.

Sortie :

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.

Sortie :

Le dictionnaire est automatiquement transformé en une ligne respectant l'ordre défini par fieldnames.

Sortie :

Plusieurs dictionnaires peuvent également être ajoutés avec writerows().

Sortie :

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.

Sortie possible si le fichier existe déjà :

Si le fichier n'existe pas encore ou s'il est vide, le même programme produit un fichier correctement structuré.

Sortie :

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.

Sortie :

Pour ajouter un nouveau produit, nous utilisons delimiter=";" avec csv.writer().

Sortie :

Le fichier contient désormais la nouvelle ligne avec le même séparateur que les lignes précédentes.

Sortie :

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.

Sortie :

Nous pouvons alors conditionner l'écriture dans le fichier au résultat de cette vérification.

Sortie :

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.

Sortie :

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.

Sortie :

La même fonction peut être appelée plusieurs fois pour ajouter successivement plusieurs étudiants.

Sortie :

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().

Sortie :

Lorsque les données sont organisées sous forme de dictionnaires, nous pouvons utiliser DictWriter().

Sortie :

 




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/


Leave a Reply

Your email address will not be published. Required fields are marked *