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