Le TP sera réalisé en Python.
On considère une série d’enregistrements concernant des ventes réalisées par un exportateur de véhicules miniatures. Pour chaque vente, il entre dans son registre de nombreuses informations :
Ces informations sont stockées dans un fichier au format ‘csv’ (comma separated values) : ventes.csv
.
Téléchargez ce fichier.
Dans un premier temps, regardez son contenu avec un editeur de texte (geany
, gedit
ou autre…). La première ligne contient les noms des attributs (NUM_COMMANDE
, QUANTITE
,…).
Les ligne suivantes contiennent les valeurs d’attributs correspondant à une vente donnée.
en tout plus de 2000 ventes sont répertoriées dans ce fichier.
Ouvrez-le maintenant à l’aide d’un tableur (par exemple localc
).
Les données sont maintenant “rangées” en lignes et colonnes pour faciliter la lecture.
Notez bien l’emplacement du fichier ventes.csv
dans l’arborescence de fichiers.
Créez maintenant un projet Python à l'aide de l'éditeur Pycharm.
Si ce n'est pas le cas, effectuez la modification dans les menus : Files > settings > project interpreter
Le but est de définir une série de fonctions permettant de manipuler les fichiers de données de type csv
.
Ecrire une fonction ouvre_fichier
permettant d'ouvrir un fichier quelconque.
None
sinon.try… except…
(essaye … sinon …) permettant de prévoir une action de secours lorsqu’une une opération “risquée” échoue.
try: f = open(nom_fichier,'r') except IOError: print("Erreur d'ouverture!")
La première ligne du fichier est différente des autres lignes. Il s'agit d'une une chaîne de caractères contenant la liste des attributs. On remarque que les différents attributs sont séparés par des virgules (la virgule est donc le caractère de séparation.)
Ecrire une fonction get_attributs
qui extrait du fichier csv
la liste des attributs.
m
d'attributs La fonction doit lire la première ligne du fichier uniquement.
ouvre_fichier
pour obtenir le decripteur de fichier f
readline
split
f.close()
.s = f.readline()
lit une ligne du fichier et la copie dans la variable s
. Chaque nouvel appel à la fonction readline
permet de lire une nouvelle ligne (jusqu’à ce qu’on atteigne la fin du fichier)s.split(',')
permet de construire une liste à partir d’une chaîne de caractères s
et un caractère séparateur ,
Ecrire une fonction get_premier_tuple
qui extrait le premier tuple du fichier de données
La fonction doit lire la deuxième ligne du fichier uniquement.
ouvre_fichier
pour obtenir le descripteur de fichierreadline
afin d'obtenir la deuxième lignesplit
m
attendu (calculé à l'aide de la fonction précédente).
Ecrire une fonction cree_dictionnaire
:
attr
et d'une liste de valeurs val
,print('nom du client :' + d['NOM_CONTACT']) print('montant de la vente :' + d['MONTANT'])
Il est possible de lire le fichier dans sa totalité en séparant les lignes avec f.readlines()
: le résultat est une liste dont chaque élément est une ligne du fichier.
Ecrire une fonction get_all_tuples
qui :
m
d'attributsn
de tuplesliste_lignes = f.readlines()
Pour lire “proprement” le contenu d’un fichier csv, on utilise la librairie csv
:
import csv
Pour ouvrir mon_fichier.csv :
flux_de_tuples = csv.reader(open("ventes.csv","r"))
flux_de_tuples
est un itérateur qui se comporte comme un flux (on ne peut pas accéder directement au ième élément flux_de_tuples[i]
).Pour lire un enregistrement, on utilise
t = next(flux_de_tuples)
où t
correspond à un tuple du fichier
Pour parcourir tous les éléments :
for t in flux_de_tuples: ...
csv
(au lieu de readline
et split
) et testez-les!get_all_tuples
.
Pour effectuer plus commodément des opérations sur les données, on veut construire une liste de dictionnaires, nommée liste_dict
, contenant la totalité des enregistrements (chaque élément liste_dict[i]
est donc un dictionnaire qui contient les valeurs du ième enregistrement sous forme de couple (attribut : valeur))
cree_liste_dict
get_all_tuples
liste_dict
On souhaite extraire des listes de valeurs particulières à partir de liste_dict
.
Si on affiche, par exemple, pour i de 0 à n-1, liste_dict[i]['PAYS']
,on obtient une liste de pays avec de nombreux doublons.
On souhaite créer une liste de pays liste_pays
sans doublon. Pour tester si un pays p
est déjà dans la liste, on utilise :
if p in liste_pays:
get_pays
liste_dict
obtenue à la question précédente get_produits
pour obtenir la liste des produitsget_clients
pour obtenir la liste des clients.Le but est maintenant d’effectuer des statistiques simples : on souhaite connaître le nombre de ventes réalisées par pays.
- a -
ventes_france
qui prend en argument la liste liste_dict
et retourne le nombre de ventes effectuées en France.- b -
ventes_par_pays
qui retourne le nombre de ventes par pays. Cette fonction prend en argument la liste liste_dict
et la liste des pays et retourne un dictionnaire nb_ventes
contenant le nombre de ventes par pays.nb_ventes = {}
for pays in liste_pays: nb_ventes[pays] = 0
liste_dict
: pour chaque élément de liste_dict
, on incrémente le nombre de ventes correspondant à liste_dict[i]['PAYS']
On constate que sont regroupés sous label différent ‘United States’
et ‘USA’
.
Écrivez et testez une fonction nettoie_USA
:
liste_dict
en remplaçant tous les attributs contenant la valeur United States
par USA
.
On constate également que dans certains cas, la valeur de l’attribut MONTANT
est erronée. On souhaite recalculer tous les montants à partir des valeurs des champs PRIX_UNITAIRE
et QUANTITE
.
Écrivez et testez une fonction nettoie_montant
liste_dict
PRIX_UNITAIRE
en “réel” à virgule flottante et le champ QUANTITE
en entier pour pouvoir ensuite calculer la valeur de MONTANT
.
n = int(s)
x = float(s)
x = eval(s)
calcule_CA
qui retourne un dictionnaire donnant le chiffre d’affaires (c’est à dire la somme des montants) par pays.
On souhaite dans un premier temps sauvegarder les données corrigées de la liste D
dans un format identique à celui du fichier de départ (format csv).
g = open('ventes_corrige.csv','w')
writer
de la librairie csv pour enregistrer les données dans un format adapté: flux_de_sortie = csv.writer(g, delimiter = ",")
writerow
permettant d’ajouter des lignes au fichier:flux_de_sortie.writerow(e)
(avec e
liste de valeurs)
attr
puis ensuite sauvegarder ligne par ligne les valeurs contenues dans liste_dict
. Attention, la ligne liste_dict[i]
étant un dictionnaire, il faut créer la liste e
à partir de liste_dict[i]
:
d = liste_dict[i] e = [d[attr[j]] for j in range(m)] flux_de_sortie.writerow(e)
N’oubliez pas de fermer le fichier à la fin de l’écriture (g.close()
).
Il est possible également de sauvegarder les données en une seule opération dans des formats différent de csv. Le format json correspond à une mise en forme de type dictionnaire, facile à lire et interpréter.
Pour importer la librairie json :
import json
On commence par ouvrir un fichier en écriture.
h = open("ventes_corrige.json", "w")
On sauvegarde liste_dict
en utilisant la méthode dump
du module json
json.dump(liste_dict, h, sort_keys=True, indent=4) h.close()
Les données ont été sauvées! ouvrez ce fichier avec un éditeur de texte pour voir à quoi ressemble ce format.
Si on veut relire l'objet contenu dans ventes_corrige.json
, on commence par ouvrir le fichier:
f = open("ventes_corrige.json", "r") liste_dict_new = json.load(f) f.close()