20. Fichiers CSV#

Nous avons vu des méthodes pour lire et écrire des fichiers CSV. Elles ont des intérêts pédagogiques car elles vous montrent le fonctionnement de l’ouverture/fermeture de fichiers et vous font travailler l’algorithmique. Ceci étant, à la longue, elles sont relativement pénibles à mettre en oeuvre. Nous allons donc voir comment, avec des dictionnaires et le module csv, on peut faciliter tout cela.

Le fichier presidents.txt contient les informations suivantes.

Annee;Prenom;Nom
1959;Charles;de Gaulle
1969;Georges;Pompidou
1974;Valéry;Giscard d'Estaing
1981;François;Mitterrand
1995;Jacques;Chirac
2007;Nicolas;Sarkozy
2012;François;Hollande
2017;Emmanuel;Macron

20.1. Lecture#

Voici comment importer ces données.

import csv
with open("../_static/datas/presidents.txt", mode="r") as f :
    reader = csv.DictReader(f, delimiter=";")
    for row in reader:
        print(row)
{'Annee': '1959', 'Prenom': 'Charles', 'Nom': 'de Gaulle'}
{'Annee': '1969', 'Prenom': 'Georges', 'Nom': 'Pompidou'}
{'Annee': '1974', 'Prenom': 'Valéry', 'Nom': "Giscard d'Estaing"}
{'Annee': '1981', 'Prenom': 'François', 'Nom': 'Mitterrand'}
{'Annee': '1995', 'Prenom': 'Jacques', 'Nom': 'Chirac'}
{'Annee': '2007', 'Prenom': 'Nicolas', 'Nom': 'Sarkozy'}
{'Annee': '2012', 'Prenom': 'François', 'Nom': 'Hollande'}
{'Annee': '2017', 'Prenom': 'Emmanuel', 'Nom': 'Macron'}

On ouvre le fichier president.txt avec la fonction open comme on le fait toujours. On passe le fichier ouvert à la fonction csv.DictReader qui permet d’analyse le fichier comme du csv. On obtient alors un itérateur que l’on peut utiliser dans une boucle for.

Chaque ligne lu est analysé automatiquement (en fonction du délimiteur, ici ;) et on récupère un ensemble de dictionnaires.

Par défaut, les noms de colonnes sont définies à partir de la première ligne du fichier csv. On peut changer se comportement en précisant le paramètre fieldnames qui prend une liste de chaines de caractères. Attention alors à la première ligne…

with open("../_static/datas/presidents.txt", mode="r") as f :
    reader = csv.DictReader(f, delimiter=";", fieldnames=["Un", "Deux", "Trois"])
    for row in reader:
        print(row)
{'Un': 'Annee', 'Deux': 'Prenom', 'Trois': 'Nom'}
{'Un': '1959', 'Deux': 'Charles', 'Trois': 'de Gaulle'}
{'Un': '1969', 'Deux': 'Georges', 'Trois': 'Pompidou'}
{'Un': '1974', 'Deux': 'Valéry', 'Trois': "Giscard d'Estaing"}
{'Un': '1981', 'Deux': 'François', 'Trois': 'Mitterrand'}
{'Un': '1995', 'Deux': 'Jacques', 'Trois': 'Chirac'}
{'Un': '2007', 'Deux': 'Nicolas', 'Trois': 'Sarkozy'}
{'Un': '2012', 'Deux': 'François', 'Trois': 'Hollande'}
{'Un': '2017', 'Deux': 'Emmanuel', 'Trois': 'Macron'}

20.2. Écriture#

Là encore, l’export des données se trouve bien facilité. Vous devriez être convaincu que les dictionnaires sont un outil très performent.

import csv

with open('../_static/datas/presidents_out.txt', 'w', newline='') as csvfile:
    fieldnames = ['Prenom', 'Nom']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'Prenom': 'Charles', 'Nom': 'de Gaulle'})
    writer.writerow({'Prenom': 'Georges', 'Nom': 'Pompidou'})

20.3. Exercice#

Reprenons maintenant la carte des plus grande villes de France, nous devrions pouvoir tout reprendre pour intégrer les dictionnaires et la lecture/écriture avec le module csv.