Introduction à la programmation avec le langage Python Séance 4 1. les fichiers 2. les modules 3. les exceptions Séance 1. les fichiers 1 : de l'idée au programe 1/4 Les fichiers sont un moyen de conserver des informations sur le disque dur. - un programme est stocké dans un fichier .py - le programme peut lui-même stocker les informations qu'il fabrique sous forme de fichier - ces informations sont le plus souvent stockées sous format texte : les informations y sont lisibles dans n'importe quel éditeur de texte (Microsoft Word par exemple, Notepad, Scite...) La question récurrente est : quelle logique (quel format) suivre pour écrire des informations ? 1. Séance les fichiers 1 : de: l'idée syntaxe au programe 2/4 Ecriture f = open ("nom_fichier.txt","w") f.write (...) f.write (...) f.close () Caractères spéciaux \n passage à la ligne \t tabulation Fichier écrasé, augmenté f = open ("nom_fichier.txt","a") "w" : le fichier est écrasé s'il existe “a" : l'écriture est faite à la fin du fichier existant Lecture f = open ("nom_fichier.txt","r") for l in f : # l désigne une ligne f.close () Caractères spéciaux la ligne est toujours terminé par \n pour la supprimer : s = l.replace ("\n", "") pour obtenir une liste lorsque les informations sont entrecoupées d'un séparateur col = l.split ("\t") Séance 1. les fichiers 1 : de: l'idée Excelau programe 3/4 Excel utilise son propre format -----.xls Mais il est possible d'échanger des informations au format texte ou csv. 1. Séance les fichiers 1 : de: l'idée Excelau programe 4/4 Résultat : Comment faire la moyenne : note = [] f = open ("note.txt","r") for l in f : s = l.replace ("\n","") no = s.split (s,"\t") # la note est sur la # 3eme colonne en # partant de 0 n = float (no [3]) note.append (n) f.close () moy = sum (no) / len (no) "Remaki" "Ines" 4 22,5 "Rouanet" "Léa" 4 24 20 "Roussel" "Pierre" 1 22 "Sarron" "Romain" 3 18 "Schmitt" "Florian" 5 23 "Shu" "Yichan" 3 17 17 "Singer" "Amandine" 7 "Sow" "Ramatoulaye"6 22 "Tang" "Xiaodong" 3 14 "Titon" "Myriam" 7 24 "Tlili" "Samira" 1 21 "Tracol" "Kévin" 1 23 "Trevien" "Corentin" 3 "Trigano" "Eleonore" 2 "Vidal" "Fanny" 2 20 "Vo The" "Thu Vân" 1 14 "Xia" "Linyan" 2 24 20 "Yu" "Jiangang" 6 24 "Zaïem" "Meryam" 1 23 "Zghal" "Thameur" 7 24 20 8 2 6,5 1 20 14 1 18 3 0 20 11,5 3 13 1,5 24 20 14 1 20 8,5 0 14 8 0 20 16 3 20 13 2 20 10 0 18 18 11,5 22 20 12,5 20 10 2 14 12 0 14 1 20 19 3 20 12 0 20 9 0 1 2 Séance 1. les fichiers 1 : de: l'idée autresauformats programe 5/4 Les formats textes sont très répandus car ils sont lisibles sur n'importe quel machine et dans n'importe quel éditeur : - format csv pour Excel et tous les tableurs - formats HTML pour les pages internet : lorsqu'un programme informatique combine des résultats graphiques et textuels, il peut être intéressant de créer une page internet et de l'afficher avec Internet Explorer ou Firefox - format XML : HTML est un exemple de langage XML : langage à balise ce format est utilisé par OpenOffice pour enregistrer ces fichiers - format tex (ou latex) : le python peut générer un fichier .tex qui peut ensuite être compilé automatique dans un fichier PDF (format standard sur Internet) Séance 2. les modules 1 : de l'idée : intérêt au programe 1/4 1. Créer un programme dont le code est réparti sur plusieurs fichiers --> le programme est plus lisible 2. Pouvoir réutiliser des sous partie d'un programme avec un autre programmer sans faire de copier-coller 3. Utiliser les modules créer par d'autres personnes Python offre un large éventail de modules (jeux, optimisation, ...) 2. Séance les modules 1 : de l'idée : pratique au programe 2/4 module : acote.py programme principal : main.py """aide associee au module""" root = 5 import acote def random global root = 12345 return () : root (root * 12345 + 9875) % root print "reel ", acote.rnd () print "entier ", acote.random () r = acote.rien () def rnd () : r = random () return float (r) / 12345 programme principal : main2.py class rien : def __init__ (rien) : pass from acote import * if __name__ == "__main__" : # test module # ce code n'est exécuté # que si le module est le fichier # principal du programme print rnd () print "reel ", rnd () print "entier ", random () r = rien () Séance 2. les modules 1 : de l'idée : pratique au programe 3/4 emplacement d'un module - le module doit être placé à côté du programme principal - sauf s'il se trouve dans le répertoire : C:\Python25\Lib\site-packages - s'il est dans un autre répertoire, il faut ajouter : import sys sys.path.append ("c:\\temp\\module") import acote - liste des modules : import sys for m in sys.modules : print m - aide sur un module import acote help (acote) # affiche l'aide du module copy_reg sre_compile locale _sre __main__ site __builtin__ operator encodings os.path encodings.encodings encodings.codecs sre_constants re ntpath UserDict nt stat zipimport warnings encodings.types _codecs encodings.cp1252 sys codecs types _types _locale signal linecache encodings.aliases exceptions sre_parse os 2. Séance les modules 1 : de l'idée : internet au programe 4/4 Exemples de modules internes (installés avec Python) url xmlparser sys Tkinter regex internet lire un fichier XML variables systèmes interface graphique expression régulière Exemples de modules externes (à télécharger depuis internet) Scipy Numpy Orange Rpy MatPlotlib wxPython PyGame PIL psyco calcul numérique tableaux optimisés pour le calcul optimisation utilisation de R sous Python graphes interface graphique plus élaborée interface graphique dédiée aux jeux traitement d'images pour accélérer les programmes Précautions : - vérifier les dépendances entre modules téléchargés - télécharger la version du module préparée pour votre version de Python (2.5 par exemple) Séance 2. les modules 1 : de l'idée : Matplotlib au programe , ... 5/4 Google Matplotlib / pylab - matlab style python plotting (plots, graphs ... http://matplotlib.sourceforge.net/ Download Installing Tutorial Examples FAQ (Frequently asked question) Autres modules http://www.vex.net/parnassus/ 3. Séance les exceptions 1 : de l'idée : objectif au programe 1/4 Les exceptions sont apparues avec les langages objets. C'est un moyen de rattraper les erreurs. x = 3.0 y = 0.0 z = x / y # erreur --> division par zero Traceback (most recent call last): File "temp.py", line 3, in <module> z = x / y # erreur --> division par zero ZeroDivisionError: float division Avec les exceptions : try : x = 3.0 y = 0.0 z = x / y # erreur --> division par zero except : print "une erreur s'est produite " le programme affiche : une erreur s'est produite Séance 3. les exceptions 1 : de l'idée : types au programe 2/4 Récupérer le message d'erreur try : x = 3.0 y = 0.0 z = x / y # erreur --> division par zero except Exception, e : print "une erreur s'est produite : ", e le programme affiche : une erreur s'est produite : float division Agir différemment selon l'erreur : try : x = 3.0 y = 0.0 + [] z = x / y # erreur --> division par zero except ZeroDivisionError, e: print "division par zero" # en cas de division par zero except Exception, e: print "autre erreur : ", e # pour les autres cas 3. Séance les exceptions 1 : de l'idée : lancer au programe 3/4 Un utilisateur peut lui-même lancer une exception : import math def log_proba (p) : if p < 0 or p > 1 : raise Exception ("p n'est pas une probabilite") return math.log (p) try : x = 5.0 y = log_proba (x) except Exception, e : print "erreur ", e La fonction log_proba déclenche une exception lorsque le nombre reçu n'est pas une exception. Le résultat de la fonction log_proba est réel, il n'existe pas de valeur réelle unique que la fonction puisse retourner en cas d'erreur --> les exceptions sont un moyen simple de retourner une erreur. Séance 3. les exceptions 1 : de l'idée : héritage au programe 4/4 import math Définir ses propres exceptions peut-être utile si on souhaite que le message d'erreur véhicule plus d'information qu'un simple message textuel. class MonException (Exception) : def __init__ (self, m, p) : Exception.__init__ (self, m) self.p = p def __str__ (self) : s = Exception.__str__ (self) s += " avec " + str (self.p) return s def log_proba (x) : if x < 0 or x > 1 : raise MonException("erreur", x) return math.log (x) try : x = 5 y = log_proba (x) except Exception, e : print e Séance 1 : de l'idée au programe FIN