Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tc_info:tp8 [2018/12/17 14:35] – edauce | tc_info:tp8 [2018/12/18 09:18] (Version actuelle) – [3 - Librairie csv :] edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Travaux Pratiques, huitième séance ====== | ||
+ | |||
+ | Le TP sera réalisé en Python. | ||
+ | |||
+ | |||
+ | ====1. Introduction==== | ||
+ | |||
+ | 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 : | ||
+ | * nom de la société cliente | ||
+ | * nom et prénom du contact, adresse, téléphone | ||
+ | * nombre d' | ||
+ | * prix de vente | ||
+ | * etc... | ||
+ | Ces informations sont stockées dans un fichier au format ‘csv’ (comma separated values) : '' | ||
+ | Téléchargez ce fichier. | ||
+ | |||
+ | Dans un premier temps, regardez son contenu avec un editeur de texte (**'' | ||
+ | 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 **'' | ||
+ | Les données sont maintenant “rangées” en lignes et colonnes pour faciliter la lecture. | ||
+ | |||
+ | Notez bien l’emplacement du fichier '' | ||
+ | |||
+ | ====2. Lecture de fichier texte et traitement des données==== | ||
+ | |||
+ | Créez maintenant un projet Python à l'aide de l' | ||
+ | <note important> | ||
+ | Lors de la première ouverture, pensez à bien sélectionner python 3.5 comme interpréteur par défaut. | ||
+ | |||
+ | 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 '' | ||
+ | |||
+ | ===2.1 Ouverture de fichier :=== | ||
+ | |||
+ | Ecrire une fonction '' | ||
+ | * La fonction prend en argument : le nom du fichier | ||
+ | * retourne : le descripteur du fichier ouvert (s'il existe) ou '' | ||
+ | |||
+ | <note tip> | ||
+ | Il est important de vérifier que l’opération d’ouverture s’effectue correctement avant de poursuivre le programme (nombreuses possibilités d’erreur : fichier effacé, erreur de nom, pas de droits de lecture, | ||
+ | On utilise une instruction de test spécifique pour vérifier que l’ouverture du fichier s’est correctement effectuée, de type '' | ||
+ | <code python> | ||
+ | try: | ||
+ | f = open(nom_fichier,' | ||
+ | except IOError: | ||
+ | print(" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | * Créez le fichier de tests permettant de tester la fonction et testez-la! | ||
+ | |||
+ | === 2.2 Récupération de la liste des attributs :=== | ||
+ | |||
+ | 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 '' | ||
+ | * la fonction prend en argument : le nom du fichier | ||
+ | * la fonction retourne : | ||
+ | * la liste des attributs | ||
+ | * le nombre '' | ||
+ | |||
+ | La fonction doit lire la première ligne du fichier uniquement. | ||
+ | * utiliser '' | ||
+ | * lire la première ligne à l'aide de la commande '' | ||
+ | * découper la chaîne de caractères à l'aide de la commande '' | ||
+ | * Une fois nos manipulations sur le fichier effectué, on ferme le fichier avec la commande '' | ||
+ | |||
+ | <note tip> | ||
+ | * La commande '' | ||
+ | * La commande '' | ||
+ | </ | ||
+ | |||
+ | * Une fois la fonction écrite, testez-la à l'aide du fichier de tests! | ||
+ | |||
+ | === 2.3 lecture d'un tuple :=== | ||
+ | |||
+ | Ecrire une fonction '' | ||
+ | |||
+ | * la fonction prend en argument : le nom du fichier | ||
+ | * la fonction retourne : | ||
+ | * une liste de valeurs (un tuple) | ||
+ | |||
+ | La fonction doit lire la **deuxième** ligne du fichier uniquement. | ||
+ | * utiliser '' | ||
+ | * appliquer 2 fois la commande '' | ||
+ | * découper la chaîne de caractères à l'aide de la commande '' | ||
+ | |||
+ | * Testez votre fonction dans le fichier de tests. Vérifiez en particulier que la liste de valeurs contient bien le nombre d' | ||
+ | |||
+ | === 2.4 Dictionnaire === | ||
+ | Ecrire une fonction '' | ||
+ | * qui prend en argument une liste d' | ||
+ | * et retourne un [[http:// | ||
+ | * la fonction doit vérifier que les 2 listes fournies sont **de même taille**. | ||
+ | |||
+ | * Vous devez tester cette fonction, en particulier: | ||
+ | * vérifiez que la liste des clés du dictionnaire correspond à la liste des attributs fournis | ||
+ | * vérifiez que la liste des valeurs du dictionnaire correspond à la liste des valeurs fournies | ||
+ | |||
+ | * une fois le dictionnaire construit, affichez quelques valeurs extraites du dictionnaire par exemple: | ||
+ | <code python3> | ||
+ | print(' | ||
+ | print(' | ||
+ | </ | ||
+ | |||
+ | |||
+ | === 2.5 Extraction de la totalité du fichier :=== | ||
+ | |||
+ | Il est possible de lire le fichier dans sa totalité en séparant les lignes avec '' | ||
+ | |||
+ | Ecrire une fonction '' | ||
+ | * prend en argument : le nom du fichier | ||
+ | * retourne : | ||
+ | * une liste d' | ||
+ | * le nombre '' | ||
+ | * une liste de tuples (un tuple par ligne du fichier hors première ligne) | ||
+ | * le nombre '' | ||
+ | |||
+ | <note tip> | ||
+ | * Pour charger la totalité du fichier en une opération, utiliser : | ||
+ | < | ||
+ | liste_lignes = f.readlines() | ||
+ | </ | ||
+ | </ | ||
+ | * Tester cette fonction à l'aide du fichier de tests. Vous testerez en particulier que le nombre d' | ||
+ | * Comment faire si ce n'est pas le cas? | ||
+ | |||
+ | ==== 3 - Librairie csv :==== | ||
+ | |||
+ | Pour lire “proprement” le contenu d’un fichier csv, on utilise la librairie '' | ||
+ | <code python> | ||
+ | import csv | ||
+ | </ | ||
+ | |||
+ | Pour ouvrir mon_fichier.csv : | ||
+ | <code python> | ||
+ | flux_de_tuples = csv.reader(open(" | ||
+ | </ | ||
+ | |||
+ | * Remarque : l’objet '' | ||
+ | |||
+ | Pour lire un enregistrement, | ||
+ | <code python> | ||
+ | t = next(flux_de_tuples) | ||
+ | </ | ||
+ | où '' | ||
+ | |||
+ | Pour parcourir tous les éléments : | ||
+ | <code python> | ||
+ | for t in flux_de_tuples: | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | * Réécrivez les fonctions de la partie précédente en utilisant maintenant les fonction de lecture de la librairie '' | ||
+ | * Testez en particulier que le nombre d' | ||
+ | |||
+ | ==== 4 - Tableau de dictionnaires ==== | ||
+ | |||
+ | Pour effectuer plus commodément des opérations sur les données, on veut construire une liste de dictionnaires, | ||
+ | |||
+ | * Ecrire et tester une fonction '' | ||
+ | * qui prend en argument : la liste d' | ||
+ | * et retourne une liste de dictionnaires '' | ||
+ | |||
+ | ===Extraire des valeurs=== | ||
+ | |||
+ | On souhaite extraire des listes de valeurs particulières à partir de '' | ||
+ | |||
+ | Si on affiche, par exemple, pour i de 0 à n-1, '' | ||
+ | |||
+ | On souhaite créer une liste de pays '' | ||
+ | <code python> | ||
+ | if p in liste_pays: | ||
+ | </ | ||
+ | |||
+ | * Ecrire et tester une fonction '' | ||
+ | * qui prend en argument '' | ||
+ | * et retourne la liste des pays. | ||
+ | * Affichez cette liste. | ||
+ | * Ecrire et tester de même : | ||
+ | * une fonction '' | ||
+ | * une fonction '' | ||
+ | |||
+ | === Statistiques basiques === | ||
+ | |||
+ | Le but est maintenant d’effectuer des statistiques simples : on souhaite connaître le nombre de ventes réalisées par pays. | ||
+ | |||
+ | - a - | ||
+ | * Ecrire et tester une fonction '' | ||
+ | * Affichez ce résultat dans le programme principal. | ||
+ | |||
+ | - b - | ||
+ | * Ecrire et tester une fonction '' | ||
+ | |||
+ | <note tip> | ||
+ | Pour construire ce dictionnaire, | ||
+ | * on crée tout d’abord un dictionnaire vide '' | ||
+ | * On parcourt ensuite la liste des pays et on initialise chaque entrée du dictionnaire : | ||
+ | <code python> | ||
+ | for pays in liste_pays: | ||
+ | nb_ventes[pays] = 0 | ||
+ | </ | ||
+ | * puis on parcourt les éléments de '' | ||
+ | </ | ||
+ | |||
+ | * Testez cette fonction | ||
+ | * Dans le programme principal, affichez le résultat de ce calcul. | ||
+ | |||
+ | === Homogénéisation des données === | ||
+ | |||
+ | On constate que sont regroupés sous label différent '' | ||
+ | |||
+ | Écrivez et testez une fonction '' | ||
+ | * qui modifie '' | ||
+ | |||
+ | On constate également que dans certains cas, la valeur de l’attribut '' | ||
+ | |||
+ | Écrivez et testez une fonction '' | ||
+ | * qui reçoit une '' | ||
+ | * et recalcule ses valeurs. | ||
+ | <note important> | ||
+ | Attention : les valeurs contenues dans le dictionnaire sont de type chaîne de caractère. Il faut donc au préalable “traduire” le champ '' | ||
+ | </ | ||
+ | |||
+ | <note tip> **rappels :** | ||
+ | * Traduction d’une chaîne de caractère s en entier : '' | ||
+ | * Traduction d’une chaîne de caractère s en réel : '' | ||
+ | </ | ||
+ | <note important> | ||
+ | Plus généralement : '' | ||
+ | </ | ||
+ | |||
+ | ===Chiffre d’affaires par pays=== | ||
+ | |||
+ | * Appelez de nouveau la fonction calculant le nombre de ventes par pays pour vérifier que tout fonctionne bien. | ||
+ | |||
+ | * Ecrivez et testez une fonction '' | ||
+ | |||
+ | ==== 5 - Sauvegarde des données ==== | ||
+ | |||
+ | === a. format csv === | ||
+ | On souhaite dans un premier temps sauvegarder les données corrigées de la liste '' | ||
+ | * On crée tout d’abord un nouveau fichier ouvert en écriture : | ||
+ | <code python> | ||
+ | g = open(' | ||
+ | </ | ||
+ | * On utilise ensuite l’objet '' | ||
+ | <code python> | ||
+ | flux_de_sortie = csv.writer(g, | ||
+ | </ | ||
+ | * On utilise ensuite la méthode '' | ||
+ | <code python> | ||
+ | flux_de_sortie.writerow(e) | ||
+ | </ | ||
+ | (avec '' | ||
+ | |||
+ | <note tip> | ||
+ | **remarque :** | ||
+ | Il faut tout d’abord sauvegarder la liste des attributs '' | ||
+ | <code python> | ||
+ | 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 ('' | ||
+ | |||
+ | === b. format json === | ||
+ | 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, | ||
+ | <note tip> | ||
+ | * voir : [[public: | ||
+ | * voir : [[public: | ||
+ | </ | ||
+ | |||
+ | Pour importer la librairie json : | ||
+ | <code python> | ||
+ | import json | ||
+ | </ | ||
+ | | ||
+ | On commence par ouvrir un fichier en écriture. | ||
+ | <code python> | ||
+ | h = open(" | ||
+ | </ | ||
+ | |||
+ | On sauvegarde '' | ||
+ | <code python> | ||
+ | json.dump(liste_dict, | ||
+ | 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' | ||
+ | |||
+ | <code python> | ||
+ | f = open(" | ||
+ | liste_dict_new = json.load(f) | ||
+ | f.close() | ||
+ | </ | ||