Fichiers et entrées / sorties Sauvegarde des programmes dans des fichiers. Compilation. Lecture et écriture de données dans des fichiers. Formatage des données en sortie.
2 Sauvegarde de vos programmes dans des fichiers Jusquà présent, nous avons utilisé Python en mode interactif ce qui a comme inconvénient que nous perdons les instructions de notre programme à la fermeture de linterpréteur. Nous allons maintenant rédiger notre programme dans un éditeur de textes tel que IDLE (Python GUI) en cliquant dans longlet File sur New Window pour créer un nouveau fichier ou sur Open pour ouvrir un fichier existant. Le programme peut ensuite être sauvegardé dans un fichier de type.py, copié, modifié, etc. Python (r252:60911, Feb , 13:11:45) [MSC v bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. **************************************************************** Personal firewall software may warn about the connection IDLE makes to its subprocess using this computer's internal loopback interface. This connection is not visible on any external interface and no data is sent to or received from the Internet. **************************************************************** IDLE >>> File Edit Shell Debug Options Windows Help
3 Compilation dun programme enregistré dans un fichier À la diapositive précédente, nous avons enregistré notre programme dans un fichier comme par exemple « essai.py ». #Voici mon programme …. A, B = input("Entrez les valeurs de A et de B : ") C1 = (A > 3) <= (B < 2) C2 = (B > 1) <= (A == 3) C3 = (A == 1) <= (B <= 1) print C1 and C2 and C3 File Edit Shell Debug Options Windows Help FormatRun Nous pouvons maintenant compiler et exécuter notre programme à partir de léditeur de textes IDLE (Python GUI) en cliquant dans longlet File sur Open pour ouvrir notre fichier « essai.py ». Cela donne lieu à la fenêtre suivante; il sagit alors de cliquer dans longlet Run sur Run Module. essai.py – E:\essai.py
4 Sauvegarde des données dun programme dans un fichier Nous allons considérer divers mécanismes permettant de créer des fichiers, dy envoyer des données et de les récupérer par après. Étape #1. Choix du répertoire dans lequel le fichier sera créé. >>> import os >>> repertoire_courant = os.getcwd() >>> print repertoire_courant C:\Python25\libs Pour connaître le répertoire courant, on peut procéder ainsi : Le module os renferme plusieurs fonctions permettant de dialoguer avec le système dexploitation. La fonction getcwd() du module os renvoie le nom du répertoire courant. Vous pouvez changer de répertoire courant comme suit : >>> import os >>> from os import * >>> chdir("E:\ProgrammesPython") >>> print getcwd() E:\ProgrammesPython >>> import os >>> os.chdir("E:\ProgrammesPython") >>> print os.getcwd() E:\ProgrammesPython ou encore
5 Étape #2. Ouverture dun fichier en écriture et écriture séquentielle. >>> FichierLogique = open("E:\ProgrammesPython\essai", "a") >>> FichierLogique.write("Si le fichier en écriture n'existe pas encore, il sera créé automatiquement. ") >>> FichierLogique.write("Par contre, si le nom utilisé concerne un fichier préexistant ") >>> FichierLogique.write("qui contient déjà des données, les caractères que vous y enregistrerez ") >>> FichierLogique.write("viendront s'ajouter à la suite de ceux qui s'y trouvent déjà.") >>> FichierLogique.close() La fonction open possède 2 chaînes de caractères comme paramètres, la première désigne le chemin daccès menant au répertoire courant et le nom du fichier à ouvrir (« essai »), la deuxième désigne le mode douverture : a :mode « append » qui consiste à ajouter les données à la fin du fichier. w :mode « write » qui entraîne la création dun nouveau fichier vide et lécriture des nouvelles données. Sil existe déjà un fichier de même nom, celui-ci est effacé au préalable. + :double accès en lecture / écriture b :accès binaire Au lieu de désigner explicitement le chemin daccès au répertoire courant, on peut le définir au début du programme comme précédemment. La méthode write() permet lécriture des données de manière séquentielle. Il ny a pas de séparateurs de ligne implicites. La méthode close() permet la fermeture du fichier pour le réutiliser par la suite.
6 Étape #3. Lecture séquentielle dun fichier de données. Exemple : Affichage à lécran du contenu dun fichier. >>> FichierLogique = open("E:\ProgrammesPython\essai", "r") >>> Contenu = FichierLogique.read() >>> print Contenu Si le fichier en écriture n'existe pas encore, il sera créé automatiquement. Par contre, si le nom utilisé concerne un fichier préexistant qui contient déjà des données, les caractères que vous y enregistrerez viendront s'ajouter à la suite de ceux qui s'y trouvent déjà. >>> FichierLogique.close() Lecture des données du fichier et transfert dans une variable de type string. Puisque la méthode read est utilisée sans argument et puisque nous navions inséré aucun caractère de séparation, la totalité du fichier est transférée. Ce code est raisonnable si la taille des fichiers nest pas trop importante. Mode douverture en lecture (valeur par défaut si non spécifié) Si le fichier nexiste pas, cela produit une erreur à lexécution. FichierLogique est un identificateur désignant le fichier ouvert.
7 Note : La méthode read peut être utilisée avec un argument, le # de caractères à lire, à partir de la position déjà atteinte dans le fichier. >>> FichierLogique = open("E:\ProgrammesPython\essai", "r") >>> print FichierLogique.read(13) Si le fichier >>> print FichierLogique.read(21) en écriture n'existe >>> print FichierLogique.read(1000) pas encore, il sera créé automatiquement. Par contre, si le nom utilisé concerne un fichier préexistant qui contient déjà des données, les caractères que vous y enregistrerez viendront s'ajouter à la suite de ceux qui s'y trouvent déjà. >>> print FichierLogique.read() >>> FichierLogique.close() Si le nombre de caractères à lire est supérieur au nombre présent dans le fichier, la lecture sarrête à la fin du fichier. Si la fin du fichier est déjà atteinte, read() renvoie une chaîne vide.
8 Copie dun fichier dans un autre, 10 caractères à la fois. Exemple : >>> def CopieDeFichier(FichierSource, FichierDestination): source = open(FichierSource, "r") destination = open(FichierDestination, "w") while 1: texte = source.read(10) if texte == "": break destination.write(texte) source.close() destination.close() return Un appel à cette fonction est réalisé comme suit : >>> CopieDeFichier("E:\ProgrammesPython\essai", "E:\ProgrammesPython\copie") Boucle sans fin. Interruption de la boucle lorsque la fin du fichier est rencontrée. Note :Les très gros fichiers de données peuvent demander trop de mémoire, auquel cas vous devrez vous résoudre à lire une ligne à la fois.
9 Insertion de marqueurs de fin de ligne dans un fichier : \n >>> F = open("E:\ProgrammesPython\Marqueurs", "w") >>> F.write("Nous pouvons insérer un marqueur de fin de lignes\n") >>> F.write("aux endroits où lon souhaite séparer les lignes du texte.\n\n") >>> F.write("Lors des opérations de lecture, les lignes dun fichier texte ") >>> F.write("peuvent être extraites séparément les unes des autres. La\n") >>> F.write("méthode readline() ne lit quune seule ligne à la fois\n") >>> F.write("(en incluant le caractère de fin de ligne).") >>> F.close() >>> F = open("E:\ProgrammesPython\Marqueurs", "r") >>> print F.readline() Nous pouvons insérer un marqueur de fin de lignes >>> print F.readline() aux endroits où lon souhaite séparer les lignes du texte. >>> LignesRestantes = F.readlines() >>> print LignesRestantes ['\n', 'Lors des opérations de lecture, les lignes dun fichier texte peuvent être extraites séparément les unes des autres. La\n', 'méthode readline() ne lit qu une seule ligne à la fois\n', '(en incluant le caractère de fin de ligne).'] >>> F.close() La méthode readlines() transfère toutes les lignes restantes dans une liste de chaînes tandis que readline() renvoie une chaîne.
10 Copie dun fichier texte en omettant les lignes de commentaires. Exemple : >>> def CopieSansCommentaires(FichierSource, FichierDestination): source = open(FichierSource, "r") destination = open(FichierDestination, "w") while 1: texte = source.readline() if texte == "": break if texte[0] != "#": destination.write(texte) source.close() destination.close() return Un appel à cette fonction est réalisé comme suit : >>> CopieSansCommentaires("E:\ProgrammesPython\essai", "E:\ProgrammesPython\copie") La variable texte contient à la fin le caractère de fin de ligne.
11 Lecture et enregistrement de valeurs autres que des chaînes de caractères. >>> a, b, c = 2, 3.75, 12. >>> F = open("E:ProgrammesPython\Valeurs", "w") >>> F.write(str(a)) >>> F.write(str(b)) >>> F.write(str(c)) >>> F.close() >>> F = open("E:ProgrammesPython\Valeurs", "r") >>> G = F.read() >>> print G, type(G) Ce nest plus possible de transformer de nouveau en valeurs numériques. Les données sont transformées en chaînes de caractères.
12 On peut procéder autrement en utilisant le module pickle permettant denregistrer des données en conservant leur type : >>> a, b, c = 2, 3.75, 12. >>> import pickle >>> F = open("E:ProgrammesPython\Valeurs", "w") >>> pickle.dump(a, F) >>> pickle.dump(b, F) >>> pickle.dump(c, F) >>> F.close() >>> F = open("E:ProgrammesPython\Valeurs", "r") >>> v = pickle.load(F) >>> print v, type(v) 2 >>> v = pickle.load(F) >>> print v, type(v) 3.75 >>> v = pickle.load(F) >>> print v, type(v) 12.0 Enregistrement des données avec leur type dans F. Lecture dune donnée respectant son type. Pour comprendre comment pickle fonctionne, nous avons : >>> F = open("E:ProgrammesPython\Valeurs", "r") >>> print F.read() I2.F3.75.F12.0.
13 Formatage de sortie à lécran Nous avons présenté jusquà maintenant 2 façons dafficher des valeurs à lécran : les expressions et linstruction print. Avec linstruction print, comment convertir des valeurs en chaînes de caractères ? >>> i, j, k = 5, 4, 20 >>> i, " fois ", j, " = ", k (5, ' fois ', 4, ' = ', 20) Les expressions ne nous donnent pas toujours le format approprié. >>> i, j, k = 5, 4, 20 >>> print i, " fois ", j, " = ", k 5 fois 4 = 20 >>> i, j, k = 5, 4, 20 >>> print i + " fois " + j + " = " + k Traceback (most recent call last): File " ", line 1, in print i + " fois " + j + " = " + k TypeError: unsupported operand type(s) for +: 'int' and 'str'
14 >>> i, j, k = 5, 4, 20 >>> print str(i) + " fois " + str(j) + " = " + str(k) 5 fois 4 = 20 La fonction str() permet de convertir une valeur numérique en chaîne de caractères. >>> i, j, k = 5, 4, 20 >>> print `i` + " fois " + `j` + " = " + `k` 5 fois 4 = 20 >>> import math >>> print "La surface du cercle de rayon 5 est : " + `math.pi * 5 * 5` La surface du cercle de rayon 5 est : On peut écrire la valeur numérique entre des guillemets renversés. >>> i, j, k = 5, 4, 20 >>> print "%5d fois %5d = %5d" (i, j, k) 5 fois 4 = 20 %5d désigne le formatage de i, j et k soit un entier à 5 positions. Puisque le format nest pas une chaîne de caractères, il y a conversion implicite. Les expressions sont listées entre parenthèses séparées par des virgules. %15s et %5.3f sont respectivement le format dune chaîne de caractères et celui dune valeur réelle. >>> import math >>> rayon = 5 >>> print "La %15s du cercle de rayon %3d est : %5.3f" % ("surface", rayon, math.pi * rayon ** 2) La surface du cercle de rayon 5 est :
15 print "\t i\t cube\n" i = 1 while (i <= 10): print "\t%4d\t%6d" % (i, i * i) i = i + 1 i cube \n :saut de ligne \t :tabulateur. >>> i = 1 >>> while (i <= 10): print i, i*2,# Supprime laffichage du caractère séparateur de lignes. i = i
16 Soit une chaîne de caractères renfermant une liste de prénoms avec leur cotisation annuelle à une association, cette chaîne a la forme suivante : $George&12.34$Luc&67%Lise&21.3$Marc&76.45%Jean&65.456# Chaque prénom est précédé dun signe $ si la cotisation a été renouvelée ou dun signe % si la cotisation est à payer. À la fin de chaque prénom, on retrouve le symbole & suivi du montant de la cotisation. Vous devez afficher un rapport avec trois colonnes, la 1 ière colonne renfermant la liste des prénoms, la 2 ième renfermant les montants de ceux qui ont renouvelé leur cotisation et la 3 ième colonne renfermant les montants de ceux qui nont pas payé leur cotisation. Finalement, on doit afficher le total des cotisations payées et celles non payées. Exemple – Impression dun rapport
17 Total_renouvele, Total_a_payer, i = 0.0, 0.0, 0 chaine_de_caracteres = input("Entrez la chaîne de caractères : ") print "\n\tCOTISATION\tCOTISATION\n\tRENOUVELÉE\tÀ PAYER\n\n" while (chaine_de_caracteres[i] != "#"): renouvelee = (chaine_de_caracteres[i] == "$") i = i + 1 nom = "" while (chaine_de_caracteres[i] != "&"): nom = nom + chaine_de_caracteres[i] i = i + 1 print nom, j = i+1 while (chaine_de_caracteres[j] != "$" and chaine_de_caracteres[j] != "%" and \ chaine_de_caracteres[j] != "#"): j = j + 1 cotisation = float(chaine_de_caracteres[i+1:j]) i = j if (renouvelee): Total_renouvele += cotisation else: print "\t\t", Total_a_payer += cotisation print "\t%6.2f" %(cotisation) print "\n\nTotal des cotisations renouvelées : ", Total_renouvele print "\nTotal des cotisations à payer : ", Total_a_payer
18 COTISATION RENOUVELÉEÀ PAYER George Luc Lise Marc Jean Total des cotisations renouvelées : Total des cotisations à payer :