Manipulation de fichiers ; graphiques élémentaires avec matplotlib Buts du TP

publicité
Sup 841 - Lycée du parc
TP Python
Manipulation de fichiers ; graphiques élémentaires avec matplotlib
Les 18 et 19 décembre 2013 et le 8 janvier 2014
http://www.mp933.fr/ - [email protected]
Buts du TP
– Apprendre à lire ligne-à-ligne le contenu d’un fichier texte ; extraire les différents champs d’une
ligne via des séparateurs. Apprendre à écrire des données simples dans un fichier texte.
– Réaliser des graphiques simples avec la bibliothèque matplotlib.
Dans la section « Pour ceux qui s’ennuient », ceux connaissant déjà Python gnagnagna...
Exercice 1 Exhumer le kit de survie « manipulation de fichiers » du machin dans lequel vous entassez
ce qui concerne l’informatique. Ce doit être facile : vous l’avez lu hier soir, normalement 1 .
Exercice 2 Créer (au bon endroit) un dossier associé à ce TP. Lancer Spyder, sauvegarder immédiatement le fichier édité au bon endroit. Écrire une commande absurde, de type print(5*3) dans l’éditeur,
sauvegarder et exécuter.
Exercice 3 Dans le dossier du TP du jour, créer un sous-dossier fichiers-entree et placer dedans
les fichiers suivants :
cadeau.py, premiers-1000.txt, admissibles.txt, matrix.txt, jocondeBW.jpg
Créer également un sous-dossier fichiers-sortie dans lequel vous placerez les fichiers créés en cours
de tp (texte et pdf ).
1
Lecture d’un fichier texte
On rappelle (« kit de survie ») que le script suivant est censé calculer le nombre de caractères d’un
fichier texte :
mon_fichier = open(’tagada.txt’)
s = 0
for L in mon_fichier:
s += len(L)
mon_fichier.close()
Exercice 4 Récupérer ces lignes dans cadeau.py, écrire par ailleurs un petit fichier texte de quelques
lignes, le sauvegarder dans le répertoire de travail, et appliquer le script (en changeant tagada.txt par
le nom sous lequel vous aurez sauvé votre fichier texte !). Observer, s’inquiéter, et essayer de trouver une
explication.
Exercice 5 À l’aide du fichier premiers-1000.txt, calculer la somme des 1000 premiers nombres
premiers.
Exercice 6 Le fichier 2 admissibles.txt contient 5398 lignes de la forme :
1234 TOURNESOL Tryphon
Admissible
2
ou bien :
43210 HADDOCK Archibald
Eliminé
(Des tabulations séparent les quatre champs ; le nom et le prénom séparés par un espace sont dans un
même champ.)
Écrire une suite d’instructions qui lit ce fichier, détermine le nombre d’admissibles et le nombre de
candidats attribués à chaque série d’oral (il y en a 4).
1. ...
2. Il s’agit des candidats au concours MP des mines 2013
1
2
Écriture dans un fichier texte
Exercice 7 On trouvera dans le fichier cadeau.py un programme testant la primalité des entiers.
Constituer un fichier texte contenant exactement tous les entiers majorés par 10000 = 104 qui sont
premiers.
Exercice 8 Constituer quatre fichiers regroupant les noms et prénoms des admissibles de chaque série
des mines (cf. exercice 6).
Exercice 9 Si c est une chaîne de caractères, c.upper() renvoie une chaîne où toutes les minuscules
de c ont été remplacées par des majuscules :
>>> ’Hop’.upper()
’HOP’
Écrire une suite d’instructions copiant un fichier en changeant toutes les minuscules en majuscules.
On pourra appliquer ceci au fichier .py contenant ces instructions ! Vous aurez alors par exemple le
fichier de travail tp_fichier.py recopié dans un fichier du genre tp_fichier_majuscules.py.
3
Quelques graphiques avec matplotlib
On commence avec un exemple simple en représentant le graphe de la fonction cosinus, avec quelques
fioritures.
Exercice 10 Taper les lignes suivantes dans le fichier python en cours, puis l’exécuter :
import matplotlib.pyplot as pypl
import numpy as np
from math import pi
t = np.linspace(-pi,3*pi,1000)
y = np.cos(t)
pypl.plot(t,y)
pypl.savefig(’cosinus.pdf’)
pypl.show()
Observer les valeurs de t et y. Réfléchir à la signification de chaque ligne.
Note : il est d’usage de regrouper tous les import ... en début de fichier.
Exercice 11 Dans les commandes de l’exercice précédent, insérer progressivement (avant le savefig)
les lignes :
pypl.grid()
pypl.axhline(color=’black’)
pypl.axvline(color=’black’)
ys = np.sin(t)
pypl.plot(t,ys)
pypl.legend([’cosinus’,’sinus’],loc=’upper left’)
Observer le résultat produit par chaque commande.
Exercice 12 Essayer de produire un fichier pdf dont le contenu ressemble à celui donné en annexe.
2
4
Pour ceux qui s’ennuient
Exercice 13 Reprendre l’exercice 7 en mettant dix nombres premiers (séparés par des tabulations par
exemple, ou des virgules...) par ligne.
Exercice 14 Écrire une fonction prenant en entrée deux noms de fichier (origine et but) et écrivant
dans le fichier but l’ensemble des lignes présentes dans le fichier origine, mais dans l’ordre inverse, et
en inversant également les caractères pour chaque ligne. Tester !
Exercice 15 Créer la matrice (80, 80) constituée des entiers présents dans le fichier matrix.txt
Il s’agira d’une liste constituée de 80 listes constituées de 80 entiers. On commencera par ouvrir le
fichier avec l’éditeur, pour voir la tête du contenu.
Exercice 16 Project Euler, problem 81 (« path sum : two ways »).
In the 5 × 5 matrix below, the minimal path sum from the top left to the bottom right, by only moving
to the right and down, is indicated in bold and is equal to 2427.


131 673 234 103 18
201 96 342 965 150 


 630 803 746 422 111 


 537 699 497 121 956 
805 732 524 37 331
Find the minimal path sum, in matrix.txt, a 31K text file containing a 80 × 80 matrix, from the top
left to the bottom right by only moving right and down.
Exercice 17 Reprendre l’exercice 7 en utilisant une redirection de sortie standard telle que décrite dans
le kit de survie.
Exercice 18 À l’aide du fichier créé dans l’exercice 13, calculer la somme des nombres premiers majorés
par 10000... en seulement trois lignes, dont une pour ouvrir le fichier, et une autre pour le fermer !
Exercice 19 Représenter le « graphe discret » des 11 premiers termes de la suite u de premier terme
u0 = −8.41 et vérifiant la relation de récurrence un+1 = − 21 un + 63 (cf. annexes).
Exercice 20 Le fichier jocondeBW.jpg peut être manipulé par Python via le module Image : on crée
un objet associé à ce fichier via la commande Mona = Image.open(’jocondeBW.jpg’)
L’objet Mona contient entre autres une méthode histogram. Observer le résultat renvoyé par cette
méthode... et représenter l’histogramme de la Joconde, ainsi que l’histogramme cumulé (ce qui induit
deux normalisations différentes de l’axe des y).
On sauvera également l’histogramme dans un fichier csv « human readable ».
5
Besoin d’indications ?
– Exercice 6. On peut créer un tableau series de quatre entiers représentant le nombre d’admissibles
aux différentes séries (en faisant attention au décalage : series[i] contient le nombre d’admissibles
à la série i+1). Pour incrémenter le compteur correspondant à la série présente dans la chaîne ch, on
pourra par exemple exécuter : series[ int(ch) - 1] += 1 Cette même chaîne aura probablement
été obtenue via quelque chose comme ligne.strip().split(’\t’)[3] !
– Exercice 8. On peut créer un tableau de 4 fichiers en une seule étape, via :
fichiers = [open(’admissibles-serie-’+str(i+1)+’.txt’,’w’) for i in range(4)]
– Exercice 12. Les mots clés suivants pourront servir, pour les fioritures :
title;
linewidth=; ’--’; ’lower right’
– Exercice 16. Si on note ϕ(i, j) le poids minimal des chemins pour arriver en position (i, j) (indexation à la Python), alors l’objectif est ϕ(79, 79). On a par ailleurs :
∀i, j > 0,
ϕ(i, j) = Mi,j + min (ϕ(i − 1, j), ϕ(i, j − 1)) .
3
6
Annexe : quelques jolis graphiques
Exercice 12
Puissances comparées
4
3
2
1
0
1
2
x
x2
x3
3
43
1
2
1
0
2
3
Exercice 19
70
60
50
40
30
20
10
0
100
4
2
6
8
10
Exercice 20
Distribution des pixels pour la Joconde
Distribution; somme normalisée
1.0
0.8
0.6
0.4
0.2
0.00
32
64
96
128
160
Niveaux de gris
4
192
224
256
Téléchargement