Université Clermont Auvergne Portail Maths Info, LAS Maths-Info, PASS Info Algo

Université Clermont Auvergne Portail Maths Info, LAS Maths-Info, PASS Info Algorithmique et Programmation en Python - Semestre 1 Algorithmique et Programmation en Python TD09 : Lire/écrire dans un fichier et traitement de données Quelques fonctions utiles pour traiter des fichiers textes : • strip , pour se débarrasser notamment des retours à la ligne qui existent naturellement en fin de ligne dans un fichier : si ligne est une variable qui contient la chaîne de caractère " une phrase ici \n" alors ligne.strip() renvoie la chaîne de caractère débarassée de tous les caractères blancs (espaces, retours à la ligne, ...) en début et fin de chaîne, ce qui donnerait ici "une phrase ici". • split, pour découper une ligne en plusieurs morceaux : ⋄sans argument : si ligne est une variable qui contient la chaîne de caractère " un mot puis deux \n " alors ligne.split() découpe la chaîne à chaque groupe de caractères blancs (espaces, retours à la ligne, ...) et renvoie une liste des morceaux ainsi obtenus, en enlevant les morceaux vides, c’est-à-dire que ligne.split() renvoie ["un", "mot", "puis", "deux"]. ⋄avec un argument : si ligne est une variable qui contient la chaîne de caractère "un;deux;trois\n" alors ligne.split(";") découpe la chaîne à chaque point-virgule et renvoie une liste des morceaux ainsi obtenus (en gardant cette fois-ci les caractères blancs et les morceaux vides), c’est-à-dire que ligne.split(";") ren- voie ["un", "deux", "trois\n"]. Si ligne2 vaut "un;deux;trois;" alors ligne2.split(";") renvoie ["un", "deux", "trois", ""] Exercice 1 : Parfum On a obtenu d’un parfumeur la composition générale de plusieurs de ses parfums, sous la forme d’un fichier. La composition de chaque parfum se trouve sur une ligne. Les éléments sont séparés par un espace. Tout est écrit en caractères minuscules. #Contenu du fichier parfum.txt bergamote clementine jasmin musc rose ylang-ylang cedre patchouli rose violette bergamote musc myrrhe thym vanille Les éléments composant un parfum s’appellent des fragrances (odeurs). Chaque parfum doit comporter différents types de fragrances : — Celles que l’on détecte en premier, puis qui se dissipent (tête). — Celles que l’on perçoit immédiatement après (cœur). — Celles qui forment la base du parfum ; ce sont des molécules plus lourdes et donc plus persistantes (fond). On veut créer une copie du fichier initial avec une disposition différente. Pour chaque parfum, on veut écrire quatre lignes : la première correspond au numéro du parfum, la deuxième correspond aux fragrances de tête, la troisième aux fragrances de cœur, et la quatrième aux fragrances de fond qui entrent dans sa composition. #Contenu du fichier parfum2.txt Parfum 1 bergamote clementine jasmin rose ylang-ylang musc Parfum 2 violette rose cedre patchouli ... Pour cela, on dispose de trois fichiers texte Tete.txt, Coeur.txt et Fond.txt qui contiennent chacun respec- tivement les fragrances de Tete, Cœur et Fond, une par ligne. Chaque fragrance apparaît dans exactement un de ces fichiers. Exemple : UCA - Licence N1 / LAS / PASS - UE Info. - Python 1 Contenu de Tete.txt bergamote citron clementine lavande menthe thym violette Contenu de Coeur.txt camomille jasmin muscade myrrhe rose sapin ylang-ylang Contenu de Fond.txt cedre cypres musc patchouli pin vanille 1. Écrire une fonction getParfums qui prend en argument un nom de fichier supposé formatté de la même façon que l’exemple parfum.txt, et qui renvoie la liste des parfums contenus dans le fichier, sous la forme d’une liste de liste de chaîne de caractères : le premier élément de la liste sera la liste des fragrances composant le premier parfum, le deuxième élément de la liste sera la liste des fragrance composant le deuxième parfum, etc... Sur l’exemple parfum.txt, on doit obtenir [['bergamote', 'clementine', 'jasmin', 'musc', 'rose', 'ylang-ylang'], ['cedre', 'patchouli', 'rose', 'violette'], ['bergamote', 'musc', 'myrrhe', 'thym', 'vanille']] 2. Écrire une fonction getFragrances qui prend en argument un nom de fichier, supposé formatté comme Tete.txt, Coeur.txt ou Fond.txt, et qui renvoie la liste des fragrances contenues dans ce fichier. 3. Écrire une fonction ecritParfums qui prend en argument un nom de fichier supposé contenir la composition des parfums au même format que l’exemple parfum.txt, et un nom de fichier de destination, et qui écrit la composition des parfums dans le fichier de destination au format voulu avec 4 lignes par parfum (une ligne avec la numérotation, une ligne avec seulement les fragrances de tête, une ligne avec seulement les fragrances de cœur et une ligne avec seulement les fragrances de fond), en supposant que l’on dispose dans le même dossier des fichiers Tete.txt, Coeur.txt et Fond.txt. On laissera une ligne blanche entre deux parfums. On s’autorisera à écrire des espaces supplémentaires en fin de ligne si cela simplifie l’algorithme. Exercice 2 : Fichier CSV Le format CSV (Comma-separated values, valeurs séparées par des virgules) est un format de fichier texte permettant de stocker des données tabulaires, sous forme de valeurs séparées par un caractère spécial, souvent une virgule ou un point-virgule. Chaque ligne du texte correspond à une ligne du tableau, et le séparateur CSV (par exemple, les virgules) correspondent aux séparations entre colonnes. Chaque portion de texte entre deux séparateurs CSV correspond donc à une cellule du tableau. 1. Écrire une fonction listeCSV qui reçoit le nom d’un fichier CSV contenant des entiers, et un argument optionnel separateurCSV valant par défaut une virgule, et qui renvoie une liste à 2 dimensions (liste de listes) représentant son contenu : chaque ligne sera représentée par une liste d’entiers. Ne pas oublier de fermer le fichier après usage. 1,2,3 2,4,9 ==> [[1,2,3],[2,4,9],[3,8,27]] 3,8,27 2. On suppose maintenant que l’on va travailler avec des fichiers CSV contenant plutôt majoritairement des cellules texte, et dont la première ligne du fichier fournit les noms des colonnes. Les lignes suivantes contiennent les valeurs. Nom,Naissance,Ville Toto,1977,Ajaccio [{'Nom':'Toto','Naissance':'1977','Ville':'Ajaccio'}, Alice,2000,Montpellier ==> {'Nom':'Alice','Naissance':'2000','Ville':'Montpellier'} Bob,1998,Grenoble {'Nom':'Bob','Naissance':'1998','Ville':'Grenoble'}] Écrire une fonction dicoCSV qui prend en argument un nom de fichier CSV et un qui crée à partir de ce fichier une liste de dictionnaires, chaque dictionnaire représentant une ligne de valeurs (type str) du fichier, dont les clés sont les noms présents sur la première ligne. Il est conseillé d’écrire une fonction auxiliaire listeNettoyee qui prend en argument une chaîne de carac- tère correspondant à une ligne de fichier (terminant par \n), et une chaîne de caractère correspondant au séparateur CSV, et qui renvoie une liste de chaînes de caractères "nettoyées" correspondant au contenu des cellules non-vides, sans caractères blancs au début ni à la fin. UCA - Licence N1 / LAS / PASS - UE Info. - Python 2 3. Écrire une fonction conversion qui prend en argument une liste de chaîne de caractères l, et une autre liste de même taille liste_type dont les valeurs valent str, int ou float, et qui modifie l de façon à convertir en int ou en float comme sur l’exemple suivant : si l vaut ["Alice", "2000", "1.67"] et liste_type vaut ["str", "int", "float"], alors il faut convertir le deuxième élément en int et le troisième en float donc l doit valoir ensuite ["Alice", 2000, 1.67] 4. Améliorer la fonction dicoCSV pour qu’elle prenne également une liste de type et qu’elle fasse appel à la fonction conversion de telle sorte que les valeurs enregistrées dans les dictionnaires correspondent à la liste des types. Dans l’exemple précédent, si l’on donne ["str", "int", "str"] comme liste de types, alors les années de naissances doivent être enregistrées comme des entiers. 5. On souhaite maintenant faire l’opération contraire de dicoCSV. Écrire une fonction ecritListeDico qui reçoit une liste de dictionnaires, au même format que la valeur de retour de dicoCSV, ainsi qu’une chaîne de caractères nomFichier, et un séparateur CSV (valant par défaut un point-virgule) et qui crée le fichier CSV correspondant à la liste de dictionnaires passée en argument. Pour simplifier, on écrira le séparateur CSV en fin de ligne (ce qui revient à créer une colonne vide en fin de tableau). N’oubliez pas les conversions. Exercice 3 : Histogramme On s’intéresse à des données mesurant le nombres de visiteurs à un stand pendant un salon d’exposition. L’intervalle entre deux mesures n’étant pas régulier, chaque relevé est du type minute:nombreDeVisiteurs où minute est un entier indiquant le nombre de minutes écoulées depuis l’ouverture du stand. Le but est de construire un histogramme de ces relevés, minute par minute, en extrapolant pour les minutes sans relevé le nombre de visiteurs au point de relevé précédent (avec un symbole différent pour distinguer les véritables relevés des extrapolations). 1:2 ====> 00| 3:5 01|** 4:4 02|-- 6:10 03|***** 8:3 04|**** 05|---- 06|********** 07|---------- 08|*** 09|--- 10|--- 1. Écrire une fonction getDonnees qui prend en argument un nom de fichier supposé formaté comme présenté précédemment et qui renvoie un dictionnaire contenant les relevés. Pour l’exemple ci-dessus, on doit obtenir {1: 2, 3: 5, 4: 4, 6: 10, 8: 3} 2. Écrire une fonction strAvecZero qui prend en argument deux entiers n et borne et qui renvoie la chaîne de caractères correspondant à n, précédé d’un ou plusieurs zéros de telle sorte qu’elle ait la même longueur que l’écriture décimale de l’entier borne. Exemple : strAvecZero(14, uploads/Philosophie/ td09-python.pdf

  • 34
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager