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 | ||
restricted:std-3:tp1:travaux_pratiques_premiere_seance_2017 [2017/09/08 16:24] – [3 - Librairie csv :] edauce | restricted:std-3:tp1:travaux_pratiques_premiere_seance_2017 [2017/09/22 09:59] (Version actuelle) – [3 - Librairie csv :] edauce | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Travaux Pratiques, première séance ====== | ||
+ | |||
+ | Le TP sera réalisé en Python. | ||
+ | |||
+ | <note tip> **Exercice facultatif (Rappels Python...) ** | ||
+ | |||
+ | - Une année bissextile est multiple de 4 mais pas multiple de 1000. Ecrire une fonction qui prend en argument une année (entier) et retourne un booléen indiquant si l' | ||
+ | - On considère la liste donnant le nombre de jours des mois de l' | ||
+ | < | ||
+ | jours_mois = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) | ||
+ | </ | ||
+ | * Ecrire une fonction qui reçoit une date (jour, mois, année) et retourne le nombre de jours depuis le premier janvier. Attention, si l' | ||
+ | |||
+ | Toutes ces fonctions seront testées par un programme principal. | ||
+ | |||
+ | </ | ||
+ | |||
+ | ====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==== | ||
+ | |||
+ | ===Ouverture du fichier en Python :=== | ||
+ | Créez maintenant un script Python, par exemple à l'aide de l' | ||
+ | <note important> | ||
+ | * Ouvrez un terminal et executez la commande '' | ||
+ | * Lors de la première ouverture, pensez à bien sélectionner python 3.5 comme interpréteur par défaut. | ||
+ | * [[public: | ||
+ | </ | ||
+ | Dans le script, ouvrez le fichier avec la commande: | ||
+ | f = open(' | ||
+ | | ||
+ | <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 '' | ||
+ | |||
+ | try : | ||
+ | f = open(' | ||
+ | except IOError: | ||
+ | print " | ||
+ | |||
+ | </ | ||
+ | |||
+ | La commande '' | ||
+ | |||
+ | |||
+ | |||
+ | === Récupération de la liste des attributs :=== | ||
+ | |||
+ | La première ligne du fichier est 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.) | ||
+ | Définissez une liste d’attributs '' | ||
+ | (la commande '' | ||
+ | |||
+ | Définissez la variable '' | ||
+ | |||
+ | === Extraction d’une ligne :=== | ||
+ | Les lignes suivantes contiennent des valeurs d’attributs. | ||
+ | |||
+ | * Lisez une nouvelle ligne et affichez-la. | ||
+ | |||
+ | Chaque ligne doit être “découpée” pour extraire les différentes valeurs. | ||
+ | * Définissez une liste de valeurs '' | ||
+ | * Affichez la liste '' | ||
+ | |||
+ | === Dictionnaire === | ||
+ | * Ecrivez une fonction qui retourne un dictionnaire '' | ||
+ | * une fois le dictionnaire construit, affichez quelques valeurs extraites du dictionnaire par exemple: | ||
+ | <code python3> | ||
+ | print(' | ||
+ | print(' | ||
+ | </ | ||
+ | Une fois nos manipulations sur le fichier effectué, on ferme le fichier avec la commande '' | ||
+ | |||
+ | ===Extraction de la totalité du fichier :=== | ||
+ | |||
+ | Il est possible de lire le fichier dans sa totalité en séparant les lignes avec '' | ||
+ | |||
+ | * Ouvrez de nouveau le fichier, et stockez la totalité du fichier dans une liste '' | ||
+ | < | ||
+ | L = f.readlines() | ||
+ | </ | ||
+ | * Définissez une variable '' | ||
+ | |||
+ | * Créez un dictionnaire correspondant à la ligne d’indice 7 : '' | ||
+ | |||
+ | ==== 3 - Librairie csv :==== | ||
+ | |||
+ | Pour lire “proprement” le contenu d’un fichier csv, on utilise la librairie '' | ||
+ | import csv | ||
+ | |||
+ | Pour ouvrir mon_fichier.csv : | ||
+ | Lr = csv.reader(open(" | ||
+ | |||
+ | * Remarque : l’objet '' | ||
+ | |||
+ | Pour lire un enregistrement, | ||
+ | e = Lr.__next__() | ||
+ | |||
+ | * Le premier élément lu '' | ||
+ | * Affichez le contenu de '' | ||
+ | |||
+ | Pour afficher tous les éléments : | ||
+ | for e in Lr : | ||
+ | print(e) | ||
+ | avec '' | ||
+ | |||
+ | * Reprenez les opérations vues dans la partie précédente : | ||
+ | * construction d’un dictionnaire pour la 1ère ligne, puis pour la 7ème ligne. | ||
+ | * quelle(s) différence(s) avec le cas précédent? | ||
+ | |||
+ | ==== 4 - Tableau de dictionnaires ==== | ||
+ | |||
+ | Pour effectuer plus commodément des opérations sur les données, on veut construire une liste de dictionnaires, | ||
+ | |||
+ | Pour parcourir la totalité de la liste '' | ||
+ | for e in Lr: | ||
+ | ... | ||
+ | for i in ... | ||
+ | d[attr[i]] = e[i] | ||
+ | ... | ||
+ | |||
+ | |||
+ | Ecrire une fonction qui prend en argument le descripteur '' | ||
+ | |||
+ | ===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 '' | ||
+ | if p in liste_pays : | ||
+ | |||
+ | * Ecrivez une fonction qui prend en argument D et retourne la liste des pays. | ||
+ | * Affichez cette liste. | ||
+ | * Faites de même pour la liste des produits et la liste des clients. | ||
+ | |||
+ | === 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 - | ||
+ | * Tout d’abord, écrivez une fonction qui prend en argument la liste '' | ||
+ | * Affichez ce résultat dans le programme principal. | ||
+ | |||
+ | - b - | ||
+ | * Ecrire ensuite une fonction qui retourne le nombre de ventes par pays. Cette fonction prend en argument la liste '' | ||
+ | |||
+ | 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 : | ||
+ | < | ||
+ | for pays in liste_pays: | ||
+ | nb_ventes[pays] = 0 | ||
+ | </ | ||
+ | * puis on parcourt les éléments de D : pour chaque élement de D, on incrémente le nombre de ventes correspondant à '' | ||
+ | |||
+ | * Testez cette fonction dans le programme principal en affichant le résultat de ce calcul. | ||
+ | |||
+ | === Homogénéisation des données === | ||
+ | |||
+ | On constate que sont regroupés sous label différent '' | ||
+ | |||
+ | On constate également que dans certains cas, la valeur de l’attribut '' | ||
+ | |||
+ | 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 : '' | ||
+ | * 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 ensuite une fonction qui retourne un dictionnaire donnant le chiffre d’affaires (c’est à dire la somme des montants) par pays. | ||
+ | |||
+ | ==== 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 : | ||
+ | < | ||
+ | g = open(' | ||
+ | </ | ||
+ | * On utilise ensuite l’objet '' | ||
+ | < | ||
+ | Lw = csv.writer(g, | ||
+ | </ | ||
+ | * On utilise ensuite la méthode '' | ||
+ | < | ||
+ | Lw.writerow(e) | ||
+ | </ | ||
+ | (avec '' | ||
+ | |||
+ | <note tip> | ||
+ | **remarque :** | ||
+ | Il faut tout d’abord sauvegarder la liste des attributs attr puis ensuite sauvegarder ligne par ligne les valeurs contenues dans D. Attention, la ligne D[i] étant un dictionnaire, | ||
+ | < | ||
+ | e = [] | ||
+ | for j in range(m): | ||
+ | e.append(d[attr[j]]) | ||
+ | Lw.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 : | ||
+ | import json | ||
+ | | ||
+ | On commence par ouvrir un fichier en écriture. | ||
+ | h = open(" | ||
+ | |||
+ | On sauvegarde notre liste D en utilisant la méthode dump du module json | ||
+ | json.dump(D, | ||
+ | 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' | ||
+ | |||
+ | f = open(" | ||
+ | D_prime = json.load(f) | ||
+ | f.close() | ||
+ | |||
+ | |||