IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Apprendre à programmer avec Python

Apprendre programmer avec Python


prcdentsommairesuivant

Chapitre 9 : Les fichiers

Jusqu' prsent, les programmes que nous avons raliss ne traitaient qu'un trs petit nombre de donnes. Nous pouvions donc chaque fois inclure ces donnes dans le corps du programme luimme (par exemple dans une liste). Cette faon de procder devient cependant tout fait inadquate lorsque l'on souhaite traiter une quantit d'information plus importante.

9.1. Utilit des fichiers

Imaginons par exemple que nous voulons crire un petit programme exerciseur qui fasse apparatre l'cran des questions choix multiple, avec traitement automatique des rponses de l'utilisateur. Comment allons-nous mmoriser le texte des questions elles-mmes ?

L'ide la plus simple consiste placer chacun de ces textes dans une variable, en dbut de programme, avec des instructions d'affectation du genre :

 
Sélectionnez

a = "Quelle est la capitale du Guatmala ?"
b = "Qui  succd  Henri IV ?"
c = "Combien font 26 x 43 ?"
... etc.

Cette ide est malheureusement beaucoup trop simpliste. Tout va se compliquer en effet lorsque nous essayerons d'laborer la suite du programme, c'est--dire les instructions qui devront servir slectionner au hasard l'une ou l'autre de ces questions pour les prsenter l'utilisateur. Employer par exemple une longue suite d'instructions if ... elif ... elif ... comme dans l'exemple ci-dessous n'est certainement pas la bonne solution (ce serait d'ailleurs bien pnible crire : n'oubliez pas que nous souhaitons traiter un grand nombre de questions !) :

 
Sélectionnez

if choix == 1:
    selection = a
elif choix == 2:
    selection = b
elif choix == 3:
    selection = c
... etc.

La situation se prsente dj beaucoup mieux si nous faisons appel une liste :

 
Sélectionnez

liste = ["Qui a vaincu Napolon  Waterloo ?",
         "Comment traduit-on 'informatique' en anglais ?",
         "Quelle est la formule chimique du mthane ?", ... etc ...]

On peut en effet extraire n'importe quel lment de cette liste l'aide de son indice. Exemple :

 
Sélectionnez

print liste[2]      ## ===> "Quelle est la formule chimique du mthane ?"

(rappel : l'indiage commence partir de zro)

Mme si cette faon de procder est dj nettement meilleure que la prcdente, nous sommes toujours confronts plusieurs problmes gnants :

  • La lisibilit du programme va se dtriorer trs vite lorsque le nombre de questions deviendra important. En corollaire, nous accrotrons la probabilit d'insrer l'une ou l'autre erreur de syntaxe dans la dfinition de cette longue liste. De telles erreurs seront bien difficiles dbusquer.
  • L'ajout de nouvelles questions, ou la modification de certaines d'entre elles, imposeront chaque fois de rouvrir le code source du programme. En corollaire, il deviendra malais de retravailler ce mme code source, puisqu'il comportera de nombreuses lignes de donnes encombrantes.
  • L'change de donnes avec d'autres programmes (peut-tre crits dans d'autres langages) est tout simplement impossible, puisque ces donnes font partie du programme lui-mme.

Cette dernire remarque nous suggre la direction prendre : il est temps que nous apprenions sparer les donnes, et les programmes qui les traitent, dans des fichiers diffrents.

Pour que cela devienne possible, nous devrons doter nos programmes de divers mcanismes permettant de crer des fichiers, d'y envoyer des donnes et de les rcuprer par aprs.

Les langages de programmation proposent des jeux d'instructions plus ou moins sophistiqus pour effectuer ces tches. Lorsque les quantits de donnes deviennent trs importantes, il devient d'ailleurs rapidement ncessaire de structurer les relations entre ces donnes, et l'on doit alors laborer des systmes appels bases de donnes relationnelles, dont la gestion peut s'avrer trs complexe. Ce sera l l'affaire de logiciels trs spcialiss tels que Oracle, IBM DB, Adabas, PostgreSQL, MySQL, etc. Python est parfaitement capable de dialoguer avec ces systmes, mais nous laisserons cela pour un peu plus tard (voir : Gestion d'une base de donnes , page 249).

Nos ambitions prsentes sont plus modestes. Nos donnes ne se comptent pas encore par centaines de milliers, aussi nous pouvons nous contenter de mcanismes simples pour les enregistrer dans un fichier de taille moyenne, et les en extraire ensuite.

9.2. Travailler avec des fichiers

L'utilisation d'un fichier ressemble beaucoup l'utilisation d'un livre. Pour utiliser un livre, vous devez d'abord le trouver ( l'aide de son titre), puis l'ouvrir. Lorsque vous avez fini de l'utiliser, vous le refermez. Tant qu'il est ouvert, vous pouvez y lire des informations diverses, et vous pouvez aussi y crire des annotations, mais gnralement vous ne faites pas les deux la fois. Dans tous les cas, vous pouvez vous situer l'intrieur du livre, notamment en vous aidant des numros de pages. Vous lisez la plupart des livres en suivant l'ordre normal des pages, mais vous pouvez aussi dcider de consulter n'importe quel paragraphe dans le dsordre.

Tout ce que nous venons de dire des livres s'applique aussi aux fichiers informatiques. Un fichier se compose de donnes enregistres sur votre disque dur, sur une disquette ou sur un CD-ROM. Vous y accdez grce son nom (lequel peut inclure aussi un nom de rpertoire). Vous pouvez toujours considrer le contenu d'un fichier comme une suite de caractres, ce qui signifie que vous pouvez traiter ce contenu, ou une partie quelconque de celui-ci, l'aide des fonctions servant traiter les chanes de caractres.

9.3. Noms de fichiers - Rpertoire courant

Pour simplifier les explications qui vont suivre, nous indiquerons seulement des noms simples pour les fichiers que nous allons manipuler. Si vous procdez ainsi dans vos exercices, les fichiers en question seront crs et/ou recherchs par Python dans le rpertoire courant. Celui-ci est habituellement le rpertoire o se trouve le script lui-mme, sauf si vous lancez ce script depuis la fentre d'un shell IDLE, auquel cas le rpertoire courant est dfini au lancement de IDLE lui-mme (Sous Windows, la dfinition de ce rpertoire fait partie des proprits de l'icne de lancement).

Si vous travaillez avec IDLE, vous souhaiterez donc certainement forcer Python changer son rpertoire courant, afin que celui-ci corresponde vos attentes. Pour ce faire, utilisez les commandes suivantes en dbut de session. (Nous supposons ici que le rpertoire vis est le rpertoire /home/jules/exercices . Vous pouvez franchement utiliser cette syntaxe (c'est--dire des caractres / et non \ en guise de sparateurs : c'est la convention en vigueur dans le monde Unix). Python effectuera automatiquement les conversions ncessaires, suivant que vous travaillez sous MacOS, Linux, ou Windows.38

 
Sélectionnez

>>> from os import chdir
>>> chdir("/home/jules/exercices")

La premire commande importe la fonction chdir() du module os. Le module os contient toute une srie de fonctions permettant de dialoguer avec le systme d'exploitation (os = operating system), quel que soit celui-ci.

La seconde commande provoque le changement de rpertoire ( chdir \x{08c5} change directory )

Notes :

  • Vous avez galement la possibilit d'insrer ces commandes en dbut de script, ou encore d'indiquer le chemin d'accs complet dans le nom des fichiers que vous manipulez, mais cela risque peut-tre d'alourdir l'criture de vos programmes.
  • Choisissez de prfrence des noms de fichiers courts. vitez dans toute la mesure du possible les caractres accentus, les espaces et les signes typographiques spciaux.

38 Dans le cas de Windows, vous pouvez galement inclure dans ce chemin la lettre qui dsigne le priphrique de stockage o se trouve le fichier. Par exemple : "D:/home/jules/exercices".

9.4. Les deux formes d'importation

Les lignes d'instructions que nous venons d'utiliser sont l'occasion d'expliquer un mcanisme intressant. Vous savez qu'en complment des fonctions intgres dans le module de base, Python met votre disposition une trs grande quantit de fonctions plus spcialises, qui sont regroupes dans des modules. Ainsi vous connaissez dj fort bien le module math et le module Tkinter.

Pour utiliser les fonctions d'un module, il suffit de les importer. Mais cela peut se faire de deux manires diffrentes, comme nous allons le voir ci-dessous. Chacune des deux mthodes prsente des avantages et des inconvnients.

Voici un exemple de la premire mthode :

 
Sélectionnez

>>>>>> import os
>>> rep_cour = os.getcwd()
>>> print rep_cour
C:\Python22\essais

La premire ligne de cet exemple importe l'intgralit du module os, lequel contient de nombreuses fonctions intressantes pour l'accs au systme d'exploitation. La seconde ligne utilise la fonction getcwd() du module os39 Comme vous pouvez le constater, la fonction getcwd() renvoie le nom du rpertoire courant (getcwd = get current working directory).

Par comparaison, voici un exemple similaire utilisant la seconde mthode d'importation :

 
Sélectionnez

>>> from os import getcwd
>>> rep_cour = getcwd()
>>> print rep_cour
C:\Python22\essais

Dans ce nouvel exemple, nous n'avons import du module os que la fonction getcwd() seule. Importe de cette manire, la fonction s'intgre notre propre code comme si nous l'avions crite nous-mmes. Dans les lignes o nous l'utilisons, il n'est pas ncessaire de rappeler qu'elle fait partie du module os.

Nous pouvons de la mme manire importer plusieurs fonctions du mme module :

 
Sélectionnez

>>> from math import sqrt, pi, sin, cos
>>> print pi
3.14159265359
>>> print sqrt(5)        # racine carre de 5
2.2360679775
>>> print sin(pi/6)      # sinus d'un angle de 30
0.5

Nous pouvons mme importer toutes les fonctions d'un module, comme dans :

 
Sélectionnez

from Tkinter import *

Cette mthode d'importation prsente l'avantage d'allger l'criture du code. Elle prsente l'inconvnient (surtout dans sa dernire forme, celle qui importe toutes les fonctions d'un module) d'encombrer l'espace de noms courant. Il se pourrait alors que certaines fonctions importes aient le mme nom que celui d'une variable dfinie par vous-mme, ou encore le mme nom qu'une fonction importe depuis un autre module. (Si cela se produit, l'un des deux noms en conflit n'est videmment plus accessible).

Dans les programmes d'une certaine importance, qui font appel un grand nombre de modules d'origines diverses, il sera donc toujours prfrable de privilgier plutt la premire mthode, c'est- dire celle qui utilise des noms pleinement qualifis.

On fait gnralement exception cette rgle dans le cas particulier du module Tkinter, parce que les fonctions qu'il contient sont trs sollicites (ds lors que l'on dcide d'utiliser ce module).

39 Le point sparateur exprime donc ici une relation d'appartenance. Il s'agit d'un exemple de la qualification des noms qui sera de plus en plus largement exploite dans la suite de ce cours. Relier ainsi des noms l'aide de points est une manire de dsigner sans ambigut des lments faisant partie d'ensembles, lesquels peuvent eux-mmes faire partie d'ensembles plus vastes, etc. Par exemple, l'tiquette systeme.machin.truc dsigne l'lment truc, qui fait partie de l'ensemble machin, lequel fait lui-mme partie de l'ensemble systeme. Nous verrons de nombreux exemples de cette technique de dsignation, notamment lors de notre tude des classes d'objets.

9.5. criture squentielle dans un fichier

Sous Python, l'accs aux fichiers est assur par l'intermdiaire d'un objet-fichier que l'on cre l'aide de la fonction interne open(). Aprs avoir appel cette fonction, vous pouvez lire et crire dans le fichier en utilisant les mthodes spcifiques de cet objet-fichier.

L'exemple ci-dessous vous montre comment ouvrir un fichier en criture , y enregistrer deux chanes de caractres, puis le refermer. Notez bien que si le fichier n'existe pas encore, il sera cr automatiquement. Par contre, si le nom utilis concerne un fichier prexistant qui contient dj des donnes, les caractres que vous y enregistrerez viendront s'ajouter la suite de ceux qui s'y trouvent dj. Vous pouvez faire tout cet exercice directement la ligne de commande :

 
Sélectionnez

>>> obFichier = open('Monfichier','a')
>>> obFichier.write('Bonjour, fichier !')
>>> obFichier.write("Quel beau temps, aujourd'hui !")
>>> obFichier.close()
>>>

Notes :

  • La premire ligne cre l'objet-fichier obFichier , lequel fait rfrence un fichier vritable (sur disque ou disquette) dont le nom sera Monfichier . Ne confondez pas le nom de fichier avec le nom de l'objet-fichier qui y donne accs. A la suite de cet exercice, vous pouvez vrifier qu'il s'est bien cr sur votre systme (dans le rpertoire courant) un fichier dont le nom est Monfichier (et vous pouvez en visualiser le contenu l'aide d'un diteur quelconque).
  • La fonction open() attend deux arguments, qui doivent tre des chanes de caractres. Le premier argument est le nom du fichier ouvrir, et le second est le mode d'ouverture. a indique qu'il faut ouvrir ce fichier en mode ajout (append), ce qui signifie que les donnes enregistrer doivent tre ajoutes la fin du fichier, la suite de celles qui s'y trouvent ventuellement dj. Nous aurions pu utiliser aussi le mode w (pour write), mais lorsqu'on utilise ce mode, Python cre toujours un nouveau fichier (vide), et l'criture des donnes commence partir du dbut de ce nouveau fichier. S'il existe dj un fichier de mme nom, celui-ci est effac au pralable.
  • La mthode write() ralise l'criture proprement dite. Les donnes crire doivent tre fournies en argument. Ces donnes sont enregistres dans le fichier les unes la suite des autres (c'est la raison pour laquelle on parle de fichier accs squentiel). Chaque nouvel appel de write() continue l'criture la suite de ce qui est dj enregistr.
  • La mthode close() referme le fichier. Celui-ci est dsormais disponible pour tout usage.

9.6. Lecture squentielle d'un fichier

Vous allez maintenant rouvrir le fichier, mais cette fois en lecture , de manire pouvoir y relire les informations que vous avez enregistres dans l'tape prcdente :

 
Sélectionnez

>>> ofi = open('Monfichier', 'r')
>>> t = ofi.read()
>>> print t
Bonjour, fichier !Quel beau temps, aujourd'hui !
>>> ofi.close()

Comme on pouvait s'y attendre, la mthode read() lit les donnes prsentes dans le fichier et les transfre dans une variable de type chane (string) . Si on utilise cette mthode sans argument, la totalit du fichier est transfre.


Notes :

  • Le fichier que nous voulons lire s'appelle Monfichier . L'instruction d'ouverture de fichier devra donc ncessairement faire rfrence ce nom-l. Si le fichier n'existe pas, nous obtenons un message d'erreur. Exemple :

     
    Sélectionnez
    
    >>> ofi = open('Monficier','r')
    IOError: [Errno 2] No such file or directory: 'Monficier'
    

    Par contre, nous ne sommes tenus aucune obligation concernant le nom choisir pour l'objetfichier. C'est un nom de variable quelconque. Ainsi donc, dans notre premire instruction, nous avons choisi de crer un objet-fichier ofi , faisant rfrence au fichier rel Monfichier , lequel est ouvert en lecture (argument r ).

  • Les deux chanes de caractres que nous avions entres dans le fichier sont prsent accoles en une seule. C'est normal, puisque nous n'avons fourni aucun caractre de sparation lorsque nous les avons enregistres. Nous verrons un peu plus loin comment enregistrer des lignes de texte distinctes.

  • La mthode read() peut galement tre utilise avec un argument. Celui-ci indiquera combien de caractres doivent tre lus, partir de la position dj atteinte dans le fichier :

     
    Sélectionnez
    
    >>> ofi = open('Monfichier', 'r')
    >>> t = ofi.read(7)
    >>> print t
    Bonjour
    >>> t = ofi.read(15)
    >>> print t
    , fichier !Quel
    

    S'il ne reste pas assez de caractres au fichier pour satisfaire la demande, la lecture s'arrte tout simplement la fin du fichier :

     
    Sélectionnez
    
    >>> t = ofi.read(1000)
    >>> print t
    beau temps, aujourd'hui !
    

    Si la fin du fichier est dj atteinte, read() renvoie une chane vide :

     
    Sélectionnez
    
    >>> t = ofi.read()
    >>> print t
     
    >>> ofi.close()
    

9.7. L'instruction break pour sortir d'une boucle

Il va de soi que les boucles de programmation s'imposent lorsque l'on doit traiter un fichier dont on ne connat pas ncessairement le contenu l'avance. L'ide de base consistera lire ce fichier morceau par morceau, jusqu' ce que l'on ait atteint la fin du fichier.

La fonction ci-dessous illustre cette ide. Elle copie l'intgralit d'un fichier, quelle que soit sa taille, en transfrant des portions de 50 caractres la fois :

 
Sélectionnez

def copieFichier(source, destination):
    "copie intgrale d'un fichier"
    fs = open(source, 'r')
    fd = open(destination, 'w')
    while 1:
        txt = fs.read(50)
        if txt =="":
            break
        fd.write(txt)
    fs.close()
    fd.close()
    return

Si vous voulez tester cette fonction, vous devez lui fournir deux arguments : le premier est le nom du fichier original, le second est le nom donner au fichier qui accueillera la copie. Exemple :

 
Sélectionnez

copieFichier('Monfichier','Tonfichier')

Vous aurez remarqu que la boucle while utilise dans cette fonction est construite d'une manire diffrente de ce que vous avez rencontr prcdemment. Vous savez en effet que l'instruction while doit toujours tre suivie d'une condition valuer ; le bloc d'instructions qui suit est alors excut en boucle, aussi longtemps que cette condition reste vraie. Or nous avons remplac ici la condition valuer par une simple constante, et vous savez galement40 que l'interprteur Python considre comme vraie toute valeur numrique diffrente de zro.

Une boucle while construite comme nous l'avons fait ci-dessus devrait donc boucler indfiniment, puisque la condition de continuation reste toujours vraie. Nous pouvons cependant interrompre ce bouclage en faisant appel l'instruction break, laquelle permet ventuellement de mettre en place plusieurs mcanismes de sortie diffrents pour une mme boucle :

 
Sélectionnez

while <condition 1> :
    --- instructions diverses ---
    if <condition 2> :
        break
    --- instructions diverses ---
    if <condition 3>:
        break
    etc.

Dans notre fonction copieFichier(), il est facile de voir que l'instruction break s'excutera seulement lorsque la fin du fichier aura t atteinte.

40 Voir page 57 : Vracit/fausset d'une expression

9.8. Fichiers texte

Un fichier texte est un fichier qui contient des caractres imprimables et des espaces organiss en lignes successives, ces lignes tant spares les unes des autres par un caractre spcial nonimprimable appel marqueur de fin de ligne 41.

Il est trs facile de traiter ce genre de fichiers sous Python. Les instructions suivantes crent un fichier texte de quatre lignes :

 
Sélectionnez

>>> f = open("Fichiertexte", "w")
>>> f.write("Ceci est la ligne un\nVoici la ligne deux\n")
>>> f.write("Voici la ligne trois\nVoici la ligne quatre\n")
>>> f.close()

Notez bien le marqueur de fin de ligne \n insr dans les chanes de caractres, aux endroits o l'on souhaite sparer les lignes de texte dans l'enregistrement. Sans ce marqueur, les caractres seraient enregistrs les uns la suite des autres, comme dans les exemples prcdents.

Lors des oprations de lecture, les lignes d'un fichier texte peuvent tre extraites sparment les unes des autres. La mthode readline(), par exemple, ne lit qu'une seule ligne la fois (en incluant le caractre de fin de ligne) :

 
Sélectionnez

>>> f = open('Fichiertexte','r')
>>> t = f.readline()
>>> print t
Ceci est la ligne un
>>> print f.readline()
Voici la ligne deux

La mthode readlines() transfre toutes les lignes restantes dans une liste de chanes :

 
Sélectionnez

>>> t = f.readlines()
>>> print t
['Voici la ligne trois\012', 'Voici la ligne quatre\012']
>>> f.close()

Remarques :

  • La liste apparat ci-dessus en format brut, avec des apostrophes pour dlimiter les chanes, et les caractres spciaux sous forme de codes numriques. Vous pourrez bien videmment parcourir cette liste ( l'aide d'une boucle while, par exemple) pour en extraire les chanes individuelles.
  • La mthode readlines() permet donc de lire l'intgralit d'un fichier en une instruction seulement. Cela n'est possible toutefois que si le fichier lire n'est pas trop gros (Puisqu'il est copi intgralement dans une variable, c'est--dire dans la mmoire vive de l'ordinateur, il faut que la taille de celle-ci soit suffisante). Si vous devez traiter de gros fichiers, utilisez plutt la mthode readline() dans une boucle, comme le montrera l'exemple de la page suivante.
  • Notez bien que readline() est une mthode qui renvoie une chane de caractres, alors que la mthode readlines() renvoie une liste. A la fin du fichier, readline() renvoie une chane vide, tandis que readlines() renvoie une liste vide.

Le script qui suit vous montre comment crer une fonction destine effectuer un certain traitement sur un fichier texte. En l'occurrence, il s'agit ici de recopier un fichier texte en omettant toutes les lignes qui commencent par un caractre '#' :

 
Sélectionnez

def filtre(source,destination):
    "recopier un fichier en liminant les lignes de remarques"
    fs = open(source, 'r')
    fd = open(destination, 'w')
    while 1:
        txt = fs.readline()
        if txt =='':
            break
        if txt[0] != '#':
            fd.write(txt)
    fs.close()
    fd.close()
    return

Pour appeler cette fonction, vous devez utiliser deux arguments : le nom du fichier original, et le nom du fichier destin recevoir la copie filtre. Exemple :

 
Sélectionnez

filtre('test.txt', 'test_f.txt')

41 Suivant le systme d'exploitation utilis, le codage correspondant au marqueur de fin de ligne peut tre diffrent. Sous Windows, par exemple, il s'agit d'une squence de deux caractres (Retour chariot et Saut de ligne), alors que dans les systmes de type Unix (comme Linux) il s'agit d'un seul saut de ligne, MacOS pour sa part utilisant un seul retour chariot. En principe, vous n'avez pas vous proccuper de ces diffrences. Lors des oprations d'criture, Python utilise la convention en vigueur sur votre systme d'exploitation. Pour la lecture, Python interprte correctement chacune des trois conventions (qui sont donc considres comme quivalentes).

9.9. Enregistrement et restitution de variables diverses

L'argument de la mthode write() doit tre une chane de caractres. Avec ce que nous avons appris jusqu' prsent, nous ne pouvons donc enregistrer d'autres types de valeurs qu'en les transformant d'abord en chanes de caractres.
Nous pouvons raliser cela l'aide de la fonction intgre str() :

 
Sélectionnez

>>> x = 52
>>> f.write(str(x))

Nous verrons plus loin qu'il existe d'autres possibilits pour convertir des valeurs numriques en chanes de caractres (voir ce sujet : Formatage des chanes de caractres , page 130). Mais la question n'est pas vraiment l. Si nous enregistrons les valeurs numriques en les transformant d'abord en chanes de caractres, nous risquons de ne plus pouvoir les re-transformer correctement en valeurs numriques lorsque nous allons relire le fichier. Exemple :

 
Sélectionnez

>>> a = 5
>>> b = 2.83
>>> c = 67
>>> f = open('Monfichier', 'w')
>>> f.write(str(a))
>>> f.write(str(b))
>>> f.write(str(c))
>>> f.close()
>>> f = open('Monfichier', 'r')
>>> print f.read()
52.8367
>>> f.close()

Nous avons enregistr trois valeurs numriques. Mais comment pouvons-nous les distinguer dans la chane de caractres rsultante, lorsque nous effectuons la lecture du fichier ? C'est impossible ! Rien ne nous indique d'ailleurs qu'il y a l trois valeurs plutt qu'une seule, ou 2, ou 4, ...

Il existe plusieurs solutions ce genre de problmes. L'une des meilleures consiste importer un module Python spcialis : le module pickle42. Voici comment il s'utilise :

 
Sélectionnez

>>> import pickle
>>> f = open('Monfichier', 'w')
>>> pickle.dump(a, f)
>>> pickle.dump(b, f)
>>> pickle.dump(c, f)
>>> f.close()
>>> f = open('Monfichier', 'r')
>>> t = pickle.load(f)
>>> print t, type(t)
5 <type 'int'>
>>> t = pickle.load(f)
>>> print t, type(t)
2.83 <type 'float'>
>>> t = pickle.load(f)
>>> print t, type(t)
67 <type 'int'>
>>> f.close()

Pour cet exemple, on considre que les variables a, b et c contiennent les mmes valeurs que dans l'exemple prcdent. La fonction dump() du module pickle attend deux arguments : le premier est la variable enregistrer, le second est l'objet fichier dans lequel on travaille. La fonction pickle.load() effectue le travail inverse, c'est--dire la restitution de chaque variable avec son type.

Vous pouvez aisment comprendre ce que font exactement les fonctions du module pickle en effectuant une lecture classique du fichier rsultant, l'aide de la mthode read() par exemple.

42 En anglais, le terme pickle signifie "conserver". Le module a t nomm ainsi parce qu'il sert effectivement enregistrer des donnes en conservant leur type.

9.10. Gestion des exceptions. Les instructions try except - else

Les exceptions sont les oprations qu'effectue un interprteur ou un compilateur lorsqu'une erreur est dtecte au cours de l'excution d'un programme. En rgle gnrale, l'excution du programme est alors interrompue, et un message d'erreur plus ou moins explicite est affich.
Exemple :

 
Sélectionnez

>>> print 55/0
ZeroDivisionError: integer division or modulo

(D'autres informations complmentaires sont affiches, qui indiquent notamment quel endroit du script l'erreur a t dtecte, mais nous ne les reproduisons pas ici).

Le message d'erreur proprement dit comporte deux parties spares par un double point : d'abord le type d'erreur, et ensuite une information spcifique de cette erreur.

Dans de nombreux cas, il est possible de prvoir l'avance certaines des erreurs qui risquent de se produire tel ou tel endroit du programme, et d'inclure cet endroit des instructions particulires, qui seront actives seulement si ces erreurs se produisent. Dans les langages de niveau lev comme Python, il est galement possible d'associer un mcanisme de surveillance tout un ensemble d'instructions, et donc de simplifier le traitement des erreurs qui peuvent se produire dans n'importe laquelle de ces instructions.

Un mcanisme de ce type s'appelle en gnral mcanisme de traitement des exceptions. Celui de Python utilise l'ensemble d'instructions try - except else , qui permettent d'intercepter une erreur et d'excuter une portion de script spcifique de cette erreur. Il fonctionne comme suit :

Le bloc d'instructions qui suit directement une instruction try est excut par Python sous rserve. Si une erreur survient pendant l'excution de l'une de ces instructions, alors Python annule cette instruction fautive et excute sa place le code inclus dans le bloc qui suit l'instruction except. Si aucune erreur ne s'est produite dans les instructions qui suivent try, alors c'est le bloc qui suit l'instruction else qui est excut (si cette instruction est prsente). Dans tous les cas, l'excution du programme peut se poursuivre ensuite avec les instructions ultrieures.

Considrons par exemple un script qui demande l'utilisateur d'entrer un nom de fichier, lequel fichier tant destin tre ouvert en lecture. Si le fichier n'existe pas, nous ne voulons pas que le programme se plante . Nous voulons qu'un avertissement soit affich, et ventuellement que l'utilisateur puisse essayer d'entrer un autre nom.

 
Sélectionnez

filename = raw_input("Veuillez entrer un nom de fichier : ")
try:
    f = open(filename, "r")
except:
    print "Le fichier", filename, "est introuvable"

Si nous estimons que ce genre de test est susceptible de rendre service plusieurs endroits d'un programme, nous pouvons aussi l'inclure dans une fonction :

 
Sélectionnez

def existe(fname):
    try:
        f = open(fname,'r')
        f.close()
        return 1
    except:
        return 0
 
filename = raw_input("Veuillez entrer le nom du fichier : ")
if existe(filename):
    print "Ce fichier existe bel et bien."
else:
    print "Le fichier", filename, "est introuvable."

Il est galement possible de faire suivre l'instruction try de plusieurs blocs except, chacun d'entre eux traitant un type d'erreur spcifique, mais nous ne dvelopperons pas ces complments ici. Veuillez consulter un ouvrage de rfrence sur Python si ncessaire.


(9) Exercices :

9.1. crivez un script qui permette de crer et de relire aisment un fichier texte. Votre programme demandera d'abord l'utilisateur d'entrer le nom du fichier. Ensuite il lui proposera le choix, soit d'enregistrer de nouvelles lignes de texte, soit d'afficher le contenu du fichier. L'utilisateur devra pouvoir entrer ses lignes de texte successives en utilisant simplement la touche <Enter> pour les sparer les unes des autres. Pour terminer les entres, il lui suffira d'entrer une ligne vide (c'est--dire utiliser la touche <Enter> seule). L'affichage du contenu devra montrer les lignes du fichier spares les unes des autres de la manire la plus naturelle (les codes de fin de ligne ne doivent pas apparatre).

9.2. Considrons que vous avez votre disposition un fichier texte contenant des phrases de diffrentes longueurs. crivez un script qui recherche et affiche la phrase la plus longue.

9.3. crivez un script qui gnre automatiquement un fichier texte contenant les tables de multiplication de 2 30 (chacune d'entre elles incluant 20 termes seulement).

9.4. crivez un script qui recopie un fichier texte en triplant tous les espaces entre les mots.

9.5. Vous avez votre disposition un fichier texte dont chaque ligne est la reprsentation d'une valeur numrique de type rel (mais sans exposants). Par exemple :
14.896
7894.6
123.278
etc.
crivez un script qui recopie ces valeurs dans un autre fichier en les arrondissant en nombres entiers (l'arrondi doit tre correct).

9.6. crivez un script qui compare les contenus de deux fichiers et signale la premire diffrence rencontre.

9.7. A partir de deux fichiers prexistants A et B, construisez un fichier C qui contienne alternativement un lment de A, un lment de B, un lment de A, ... et ainsi de suite jusqu' atteindre la fin de l'un des deux fichiers originaux. Compltez ensuite C avec les lments restant sur l'autre.

9.8. crivez un script qui permette d'encoder un fichier texte dont les lignes contiendront chacune les noms, prnom, adresse, code postal et n de tlphone de diffrentes personnes (considrez par exemple qu'il s'agit des membres d'un club)

9.9. crivez un script qui recopie le fichier utilis dans l'exercice prcdent, en y ajoutant la date de naissance et le sexe des personnes (l'ordinateur devra afficher les lignes une par une, et demander l'utilisateur d'entrer pour chacune les donnes complmentaires).

9.10. Considrons que vous avez fait les exercices prcdents et que vous disposez prsent d'un fichier contenant les coordonnes d'un certain nombre de personnes. crivez un script qui permette d'extraire de ce fichier les lignes qui correspondent un code postal bien dtermin.

9.11. Modifiez le script de l'exercice prcdent, de manire retrouver les lignes correspondant des prnoms dont la premire lettre est situe entre F et M (inclus) dans l'alphabet.

9.12. crivez des fonctions qui effectuent le mme travail que celles du module pickle (voir page 117). Ces fonctions doivent permettre l'enregistrement de variables diverses dans un fichier texte, en les accompagnant systmatiquement d'informations concernant leur format exact.


prcdentsommairesuivant

Licence Creative Commons
Le contenu de cet article est rédigé par Gérard Swinnen et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.