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.
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 :
for row in reader:
va alors permettre d'énumérer les différentes lignes de notre fichier csv.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']
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 :
for ligne in csv_file:
.split(',')
.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'}
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'}]
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
Pour cela on peut utiliser les listes en compréhension :
infos = [p for p in personnes if p['nom'] == 'Herpan']
Ce qui nous donne :
>>> infos [{'nom': 'Herpan', 'prenom': 'stephan', 'age': '22'}]
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'}]
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'}]
(d'après liste discussion NSI)