Manipulations de fichiers 1 Boîte à outils

Transcription

Manipulations de fichiers 1 Boîte à outils
Luminy 2013
TP Python
Manipulations de fichiers
Les 7 et 8 mai 2013
[email protected]
Débuter dans de bonnes conditions
Dans le répertoire de travail, qui n’est bien entendu ni documents/ ni documents/python/ mais
plutôt quelque chose comme documents/python/luminy2013/tp-fichiers/, créer des dossiers FilesIn
et FilesOut. Placer dans FilesIn/ les fichiers suivants :
premierspremiers.txt, matrix.txt, sudoku.txt et joconde.bmp
La création des dossiers (et la mise en place des contenus) peut être faite par python ! Taper ceci dans
le dossier où se trouve le fichier .tar (ça fonctionne au moins sous linux).
Programme 1 — Pour ceux qui sont joueurs...
import tarfile
tarfile . open ( ’ materiel - tp - fichier . tar ’ ). extractall ()
Ceux qui sont encore plus joueurs peuvent aller chercher l’archive sur le web sans clic (tellement
vulgaire)...
Programme 2 — Pour ceux qui sont très joueurs
import urllib
urllib . urlretrieve ( ’ http :// blog . mp933 . fr / public / Python /\
␣ ␣ ␣ ␣ ␣ ␣ ␣ ␣ Annexes / materiel - tp - fichier . tar ’ , ’ ./ materiel - tp - fichier . tar ’)
Tout ce TP a été testé sous Python 2. Je suis preneur de retours sur Python 3...
1
Boîte à outils
1.1
Manipulations de base
Pour ce qui sort de ces choses basiques : RTFM !
Quoi
Ouverture en lecture
Ouverture en écriture
Fermeture
Lire la ligne suivante
Lire toutes les lignes
Écrire dans le fichier...
et passer à la ligne suivante
Comment
monfichier=open(’lenom.txt’,’r’)
monfichier=open(’lenom.txt’,’w’)
monfichier.close()
monfichier.readline()
for l in monfichier.readlines():
...
monfichier.write(’plof’)
monfichier.write(’plof\n’)
1
Programme 3 — Écrire les 1000 premiers premiers dans un fichier.
fileout = open ( ’ premierspremiers . txt ’ , ’w ’)
nb , k = 0 ,2
while nb < 1000:
if premier ( k ):
fileout . write ( str ( k )+ ’\ n ’)
nb += 1
k += 1
fileout . close ()
(Une fonction premier est fournie dans les annexes)
Programme 4 — Et pour les lire en les sommant...
filein = open ( ’ premierspremiers . txt ’ , ’r ’)
s = 0
for l in filein . readlines ():
s += int ( l )
filein . close ()
1.2
Split, votre nouvel ami
Quoi
Séparer selon les symboles ’:’
ou selon les tabulations
Virer d’abord les saletés de fin de ligne
Comment
toto.split(’:’)
toto.split(’\t’)
toto.rstrip().split(’:’)
Imaginons les 100 premiers nombres premiers écrits dans un fichier, mais regroupés par 10 (c’est
l’objet de l’exercice 1), et séparés par des tabulations. Pour les lire et les mettre dans une liste, ça
pourrait donner :
– En français : «j’ouvre tel fichier ; pour chaque ligne de ce fichier, je vire les saletés de fin de ligne,
je sépare via les tabulations, j’applique la conversion en entier à chaque chaîne de la liste ainsi
obtenue... et je concatène le résultat à droite d’une liste de travail.»
– En python :
Programme 5 — Par blocs de 10
filein = open ( ’ FilesOut / premiers - par -10. txt ’ , ’r ’)
lp = []
for l in filein . readlines ():
lp = lp + map ( int , l . rstrip (). split ( ’\ t ’ ))
filein . close ()
La traduction est assez naturelle, non ?
2
1.3
Manipuler des fichiers bitmap
Quoi
THE librairie...
Ouverture (en lecture)
Récupérer la taille
Conversion en niveaux (Levels) de gris
Sauvons Mona
Si on préfère le jpg...
ou le pdf...
Comment
import Image
Mona = Image.open(’FilesIn/joconde.bmp’)
Mona.size
MonaBlack = Mona.convert(’L’)
MonaBlack.save(’FilesOut/jocondeBW.bmp’)
Mona.save(’FilesOut/joconde.jpg’)
Mona.save(’FilesOut/joconde.pdf’)
Les données sont accessibles via la méthode getdata(), qui fournit un objet pouvant être transformé
en liste. Pour le travail inverse, il s’agit de la méthode putdata(). Si on travaille avec numpy (et c’est
bien pratique...), on passera par des array.
Quoi
Extraire les données...
et en faire une liste (linéaire)
Mettre les données dans un tableau numpy
Créer une image à partir de la liste de ses pixels
Comment
donnees = MonaBlack.getdata()
ldonnees = list(donnees)
bar = numpy.array(MonaBlack)
MonaAgain = Image.new(MonaBlack.mode,MonaBlack.size)
MonaAgain.putdata(ldonnees)
Image.fromarray(bar,mode=’L’).save(’....bmp’)
Créer une image à partir du tableau de ses pixels
1.4
Bonus : créer des pdf simplement
Une façon basique de procéder : dessiner des choses dans un canevas.
Quoi
La librairie en jeu
Créer un canevas
Mettre des choses dedans
Changer des caractéristiques
Le sauver
Comment
from reportlab.pdfgen import canvas
Descartes = canvas.Canvas(’tangents.pdf’)
Crible.drawString(100,300,’Hello world’)
Crible.line(x0,y0,x1,y1)
Crible.rect(x0,y0,deltax,deltay)
Descartes.circle(400,400,100,fill=True)
Crible.setFont("Helvetica",14)
Crible.setStrokeColorRGB(255,0,0)
Descartes.setFillColorRGB(255,255,255)
Descartes.save()
Pour faire plus et/ou mieux et/ou différemment (en particulier, utiliser platypus)... RTFM, as usual.
2
Exercices sur des fichiers texte
2.1
Écriture des nombres premiers par 10
Exercice 1 Lire les 1000 premiers nombres premiers dans le fichier premierspremiers.txt... et les
mettre dans une liste. Écrire ensuite dans un nouveau fichier ces 1000 entiers regroupés par 10 et séparés
par des tabulations. Ouvrir le fichier créé avec votre éditeur préféré.
Ce deuxième exercice n’est pas à traiter en priorité !
Exercice 2 Calculer tous les nombres premiers inférieurs à 106 . Ces nombres seront mis par lignes de
dix (séparés par des virgules) dans dix fichiers traitant des tranches de longueur 105 .
Par exemple, la première ligne de mon fichier Tranche8.txt est
800011,800029,800053,800057,800077,800083,800089,800113,800117,800119
3
et la dernière est 1 :
899939,899971,899981,
Combien d’entiers inférieurs à 106 sont premiers ?
2.2
Un project Euler (le 81)
Exercice 3 Créer la matrice (80, 80) constituée des entiers présents dans le fichier matrix.txt
Exercice 4 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.
Indications : Si on note ϕ(i, j) la somme minimale pour aller jusqu’à la case (i, j), les cas de bord
sont simples, et puisque “on vient d’en haut ou de la gauche”, on a une relation simple permettant de
calculer les ϕ(i, j) par programmation dynamique/memoïsation. On trouvera 427337.
Si vous trouvez 428433, regardez comment vous avez créé la matrice destinée à tabuler les ϕ(i, j)...
2.3
Des grilles de sudoku
Exercice 5 Dans le fichier sudoku.txt, on trouve 50 grilles de sudoku. Ouvrez ce fichier avec un
éditeur, histoire de voir sa tête. Importez les 50 grilles pour en faire une liste de 50 listes de 9 listes de
9 entiers !
Les deux exercices suivants sont très optionnels...
Exercice 6 Affichez les grilles en mode texte. Exemple :
>>> print(prettyprinting(grids[10]))
----------------|
|1 2 5|4
|
|
8|4
|
|
|4 2 |8
|
|
----------------| 3 |
| 9 5|
| 6 |9
2| 1 |
|5 1 |
| 6 |
----------------|
|
3| 4 9|
|
|
7|2
|
|
1|2 9 8|
|
----------------On aura noté que ma fonction prettyprinting retourne une chaîne, plutôt que de réaliser elle-même
l’affichage via print sans rien retourner.
Exercice 7 Vous avez trouvé le résultat de l’exercice précédent vraiment laid ? C’est normal. Il convient
donc de créer 50 jolis pdf... Un exemple de rendu possible est donné en annexe.
1. Et oui, je sais que ce serait mieux sans la virgule finale !
4
3
Exercices sur des images
3.1
Distribution de niveaux de gris
Faisons comme s’il n’existait pas de méthode histogram() faisant ce qu’on imagine...
Exercice 8 L’image noir et blanc de Mona Lisa nous fournit 350 × 540 pixels, qui sont des entiers
entre 0 et 255. Déterminer la loi de répartition de ces pixels (bref : une liste de 256 éléments décrivant le
nombre de pixels ayant telle valeur). Sauver ces valeurs (ainsi que les sommes cumulées) dans un fichier
csv. Comparer avec la méthode histogram(). Enfin, regarder l’effet de cette méthode sur une image en
couleur.
L’exercice suivant est réservé à ceux qui connaissent déjà matplotlib. Les autres iront voir le corrigé !
Exercice 9 Représenter l’histogramme de la Joconde avec matplotlib.
Exercice 10 Comparer l’histogramme de Mona Lisa lorsqu’elle passe du format bmp au format jpg.
3.2
Floutage
Pour flouter une image, un procédé raisonnable consiste à remplacer chaque pixel par la moyenne des
pixels sur un certain voisinage (typiquement, les 9, 25 ou 49 voisins...). Si on travaille en couleurs, on
fait la même chose sur chaque composante RGB.
On va travailler avec numpy, qui offre ici trois avantages :
– on récupère un tableau au bon format (au passage, ses dimensions sont données par le champ shape
du tableau) ;
– on peut extraire facilement un sous-tableau via t[i1:i2,j1:j2], et on fait facilement la somme
d’un tel sous-tableau via numpy.sum.
– les calculs sont censés être rapides (mouais...).
Exercice 11 Écrire une fonction réalisant le floutage d’une image (noir et blanc, ou RGB, composante
par composante).
3.3
Découpage et collage
Exercice 12 Mettre un bandeau bleu sur les yeux de Mona Lisa.
Exercice 13 Échanger deux zones rectangulaires de la Joconde.
4
Annexes
4.1
Primalité
Programme 6 — Un code basique
def premier ( n ):
if n == 1: return False
if n <= 3: return True
k = 2
while k **2 <= n :
if n % k == 0: return False
k += 1
return True
5
4.2
Pour occuper les cancres
Grille numéro 11
1
8
4
2
2
5
4
4
8
3
9
6
5
9
2
1
1
6
3
7
1
2
9
4
9
2
8
La Joconde défigurée
Distribution des pixels pour la Joconde
1.0
Distribution; somme normalisée
4.3
5
0.8
0.6
0.4
0.2
0.00
32
64
96
128
160
Niveaux de gris
192
Figure 1 – Mona Lisa dévoilée
6
224
256
Figure 2 – Les effets terribles du floutage
Figure 3 – Mona Lisa préfère ne plus voir ces bêtises
7

Documents pareils