logo
Le traitement de données structurées
en Python

warning  Cet algorithme peut être mis en oeuvre au travers de l'activité Patisserie.


Après avoir découvert le format CSV, nous allons maintenant, à l'aide de Python, apprendre à effectuer des traitements sur ces données.

Pour traiter des données, nous allons utiliser la bibliothèque Python csv.

Pour nos premiers pas avec csv, nous allons utiliser des données très simples au format CSV : ces données sont contenues dans le fichier personnes.csv.

Lecture du fichier csv

Après avoir téléchargé le fichier personnes.csv, placez-le dans le même dossier que vos programmes Python.


Puis dans votre IDE Python, saisissez le code suivant :

import csv
csv_file = open('personnes.csv', "r")
reader = csv.reader(csv_file)

for row in reader:
    print(row)
    
csv_file.close()

Une fois le code saisi, enregistrer le fichier contenant ce code dans le même répertoire que le fichier personnes.csv


Le code ci-dessus est très simple :

Exécutez le programme que vous venez de saisir. Vous devriez voir apparaitre les données sous forme de listes.

La première liste correspondant au nom des entêtes du fichier.

['nom', 'prenom', 'age']
['Durand', 'Jean-Pierre', '32']
['Dupont', 'Christophe', '51']
['Terta', 'Henry', '37']
['Kapri', 'Leon', '45']
['Lenard', 'Georges', '15']
['Herpan', 'stephan', '22']
['Mastic', 'Brice', '61']
['Pouyeau', 'Maxime', '27']
['Arox', 'Gilles', '51']
['Follin', 'Paul', '32']

Point info

Il serait possible de lire notre fichier sans utiliser le module csv.

Voici le programme python correspondant :

csv_file = open('personnes.csv', "r")

for ligne in csv_file:
    donnees = ligne.strip().split(',')
    print(donnees)
    
csv_file.close()

Le code ci-dessus est très simple :

Plus loin avec le module csv

Si nous utilisons le module csv, c'est qu'il permet de faciliter l'écriture de nos programmes.

Dans l'exemple précédent nous n'avons par vraiment tenu compte de l'entête de notre fichier (première ligne).

Nous allons voir ici, qu'il est possible pour chacune des données de notre fichier, de créer un dictionnaire qui va nous permettre d'identifier plus facilement nos informations.

L'idée étant d'obtenir un format de donnée comme celui-ci :

{'nom': 'Durand', 'prenom': 'Jean-Pierre', 'age': '32'}

Voici le programme python correspondant :

import csv
csv_file = open('personnes.csv', "r")
reader = csv.DictReader(csv_file)

for row in reader:
    print(dict(row))
    
csv_file.close()

Nous avons remplacé le lecteur (reader) de base par un lecteur avec création automatique de dictionnaire (DictReader). Celui-ci va permettre, comme dans la version précédente de lire le fichier ligne par ligne mais en faisant le lien avec la ligne d'entête !

A l'exécution de ce programme nous obtenons donc :

{'nom': 'Durand', 'prenom': 'Jean-Pierre', 'age': '32'}
{'nom': 'Dupont', 'prenom': 'Christophe', 'age': '51'}
{'nom': 'Terta', 'prenom': 'Henry', 'age': '37'}
{'nom': 'Kapri', 'prenom': 'Leon', 'age': '45'}
{'nom': 'Lenard', 'prenom': 'Georges', 'age': '15'}
{'nom': 'Herpan', 'prenom': 'stephan', 'age': '22'}
{'nom': 'Mastic', 'prenom': 'Brice', 'age': '61'}
{'nom': 'Pouyeau', 'prenom': 'Maxime', 'age': '27'}
{'nom': 'Arox', 'prenom': 'Gilles', 'age': '51'}
{'nom': 'Follin', 'prenom': 'Paul', 'age': '32'}

Stocker les données/dictionnaire dans une liste

Dans la pratique, on mémorise les données du fichier dans une liste.

import csv

reader = csv.DictReader(open('personnes.csv', 'r'))
personnes = []
for row in reader:
    personnes.append(dict(row))

Que l'on peut encore écrire, de manière encore plus concise :

import csv

reader = csv.DictReader(open('personnes.csv', 'r'))
personnes = [dict(ligne) for ligne in reader]

Personnes est donc une liste de nos enregistrements :

>>> personnes
[{'nom': 'Durand', 'prenom': 'Jean-Pierre', 'age': '32'}, 
{'nom': 'Dupont', 'prenom': 'Christophe', 'age': '51'}, 
{'nom': 'Terta', 'prenom': 'Henry', 'age': '37'}, 
{'nom': 'Kapri', 'prenom': 'Leon', 'age': '45'}, 
{'nom': 'Lenard', 'prenom': 'Georges', 'age': '15'}, 
{'nom': 'Herpan', 'prenom': 'stephan', 'age': '22'}, 
{'nom': 'Mastic', 'prenom': 'Brice', 'age': '61'}, 
{'nom': 'Pouyeau', 'prenom': 'Maxime', 'age': '27'}, 
{'nom': 'Arox', 'prenom': 'Gilles', 'age': '51'}, 
{'nom': 'Follin', 'prenom': 'Paul', 'age': '32'}]

Point info

Toujours sans le module csv notre programme devient:

csv_file = open('personnes.csv', "r")

personnes = []
entetes = fichier.readline().strip().split(',')

for ligne in csv_file:
    donnees = ligne.strip().split(',')
    personnes.append({entete:donnees[index] for index, entete in enumerate(entetes)})
    
csv_file.close()

N'hésitez pas à poser toutes questions utiles à votre enseignant pour qu'il vous explique ce code

Ce code illustre comment travaille le DictReader du module csv

Extraire des données suivant certains critères.

Pour cela on peut utiliser les listes en compréhension :

Exemple n°1

infos = [p for p in personnes if p['nom'] == 'Herpan']

Ce qui nous donne :

>>> infos
[{'nom': 'Herpan', 'prenom': 'stephan', 'age': '22'}]

Exemple n°2

Vous noterez la conversion de 'age' stocké sous forme d'une chaîne dans le dictionaire et qu'il faut convertir en entier.

jeunes = [p for p in personnes if int(p['age']) < 30]

Ce qui nous donne :

>>> jeunes
[{'nom': 'Lenard', 'prenom': 'Georges', 'age': '15'}, 
{'nom': 'Herpan', 'prenom': 'stephan', 'age': '22'}, 
{'nom': 'Pouyeau', 'prenom': 'Maxime', 'age': '27'}]

Exemple n°3

Ici nous travaillons avec une table supplémentaire : transports.csv

>>> transports
[{'age': '32', 'vehicule': 'voiture'}, 
{'age': '51', 'vehicule': 'tracteur'}, 
{'age': '37', 'vehicule': 'voiture'}, 
{'age': '45', 'vehicule': 'voiture'}, 
{'age': '15', 'vehicule': 'trotinette'}, 
{'age': '22', 'vehicule': 'trotinette'}, 
{'age': '61', 'vehicule': 'tracteur'}, 
{'age': '27', 'vehicule': 'voiture'}]

Ici on veut ajouter aux personnes le transport correspondant en fonction de leur age.

for i in range(len(personnes)):
    for v in [ vh for vh in transports if vh['age']==personnes[i]['age'] ]:
        personnes[i]['vehicule'] = v['vehicule']

Ce qui nous donne :

>>> personnes
[{'nom': 'Durand', 'prenom': 'Jean-Pierre', 'age': '32', 'vehicule': 'voiture'}, 
{'nom': 'Dupont', 'prenom': 'Christophe', 'age': '51', 'vehicule': 'tracteur'}, 
{'nom': 'Terta', 'prenom': 'Henry', 'age': '37', 'vehicule': 'voiture'}, 
{'nom': 'Kapri', 'prenom': 'Leon', 'age': '45', 'vehicule': 'voiture'}, 
{'nom': 'Lenard', 'prenom': 'Georges', 'age': '15', 'vehicule': 'trotinette'}, 
{'nom': 'Herpan', 'prenom': 'stephan', 'age': '22', 'vehicule': 'trotinette'}, 
{'nom': 'Mastic', 'prenom': 'Brice', 'age': '61', 'vehicule': 'tracteur'}, 
{'nom': 'Pouyeau', 'prenom': 'Maxime', 'age': '27', 'vehicule': 'voiture'}, 
{'nom': 'Arox', 'prenom': 'Gilles', 'age': '51', 'vehicule': 'tracteur'}, 
{'nom': 'Follin', 'prenom': 'Paul', 'age': '32', 'vehicule': 'voiture'}]

Ressources :

  1. fichier csv (chicoree.fr).
  2. Mémo CSV (quennec.fr).
  3. Un autre module python pour les fichiers csv (pandas).

CCBYNCSA"
(d'après liste discussion NSI)

(C. Béasse - Juin 2019)