Chapitre 7 : Fichiers

         1 – Lecture dans un fichier

    Dans la plupart des travaux de programmation, on doit lire ou écrire dans un fichier. Python possède pour cela tout un tas d’outils qui vous simplifient la vie. Avant de passer à un exemple concret, créez un fichier dans un éditeur de texte que vous enregistrerez dans votre répertoire avec le nom zoo.txt, par exemple :
girafe
tigre
singe
souris
Ensuite, testez cet exemple :

Code python

>>> filin = open(‘zoo.txt’, ‘r’)
>>> filin
<open file ‘zoo.txt’, mode ‘r’ at 0x7f8ea16efc00>
>>> filin.readlines()
[‘girafen’, ‘tigren’, ‘singen’, ‘sourisn’]
>>> filin.close()
>>> filin
<closed file ‘zoo.txt’, mode ‘r’ at 0x7f8ea16efc00>
La première commande ouvre le fichier zoo.txt en lecture seule (ceci est indiqué avec la lettre r). Remarquez que le fichier n’est pas encore lu, mais simplement ouvert (un peu comme lorsqu’on ouvre un livre, mais qu’on ne l’a pas encore lu). Lorsqu’on affiche la valeur de la variable filin, vous voyez que Python la considère comme un objet de type fichier
<open file ‘zoo.txt’, mode ‘r’ at 0x7f8ea16efc00>
Et oui, Python est un langage orienté objet. Retenez seulement que l’on peut considérer chaque variable comme un objet sur lequel on peut appliquer des méthodes.
À propos de méthode, on applique la méthode readlines() sur l’objet filin dans l’instruction suivante (remarquez la syntaxe du type objet.méthode). Ceci nous retourne une liste contenant toutes les lignes du fichier (dans notre analogie avec un livre, ceci correspondrait à lire les lignes du livre).
Enfin, on applique la méthode close() sur l’objet filin, ce qui vous vous en doutez, va fermer le fichier (ceci correspondrait bien sûr à fermer le livre). On pourra remarquer que l’état de l’objet a changé
<closed file ‘zoo.txt’, mode ‘r’ at 0x7f8ea16efc00>
Vous n’avez bien-sûr pas à retenir ces concepts d’objets pour pouvoir programmer avec Python, nous avons juste ouvert cette parenthèse pour attirer votre attention sur la syntaxe.

Remarque : n’utilisez jamais le mot file comme nom de variable pour un fichier car file est un mot réservé de Python.

Voici maintenant un exemple complet de lecture d’un fichier avec Python.

Code python

>>> filin = open(‘zoo.txt’, ‘r’)
>>> lignes = filin.readlines()
>>> lignes
[‘girafen’, ‘tigren’, ‘singen’, ‘sourisn’]
>>> for i in lignes:
… print i

girafe

tigre

singe

souris

>>> filin.close()
Vous voyez qu’en cinq lignes de code, vous avez lu et parcouru le fichier.

Remarques :

Notez que la liste lignes contient le caractère n à la fin de chacun de ses éléments. Ceci correspond au saut à la ligne de chacune d’entre elles (ceci est codé par un caractère spécial que l’on symbolise par n). Vous pourrez parfois rencontrer également la notation octale 012.
Remarquez aussi que lorsque l’on affiche les différentes lignes du fichier à l’aide de la boucle for et de l’instruction print, Python saute à chaque fois une ligne.
Méthode read()

Il existe d’autres méthodes que readlines() pour lire (et manipuler) un fichier. Par exemple, la méthode read() lit tout le contenu d’un fichier et renvoie une chaîne de caractères unique.

Code python

>>> filin = open(‘zoo.txt’, ‘r’)
>>> filin.read()
‘girafentigrensingensourisn’
>>> filin.close()
Méthode readline()

La méthode readline() (sans s) lit une ligne d’un fichier et la renvoie sous forme d’une chaîne de caractères. À chaque nouvel appel de readline(), la ligne suivante est renvoyée. Associée à la boucle while, cette méthode permet de lire un fichier ligne par ligne.

Code python

>>> filin = open(‘zoo.txt’, ‘r’)
>>> ligne = filin.readline()
>>> while ligne != «  »:
… print ligne
… ligne = filin.readline()

girafe

tigre

singe

souris

>>> filin.close()
Méthodes seek() et tell()

Les méthodes seek() et tell() permettent respectivement de se déplacer au nième caractère (plus exactement au nième octet) d’un fichier et d’afficher où en est la lecture du fichier, c’est-à-dire quel caractère (ou octet) est en train d’être lu.

Code python

>>> filin = open(‘zoo.txt’, ‘r’)
>>> filin.readline()
‘girafen’
>>> filin.tell()
7
>>> filin.seek(0)
>>> filin.tell()
0
>>> filin.readline()
‘girafen’
>>> filin.close()
On remarque qu’à l’ouverture d’un fichier, le tout premier caractère est considéré comme le caractère 0 (tout comme le premier élément d’une liste). La méthode seek() permet facilement de remonter au début du fichier lorsque l’on est arrivé à la fin ou lorsqu’on en a lu une partie.

Itérations directement sur le fichier

Python essaie de vous faciliter la vie au maximum. Voici un moyen à la fois simple et élégant de parcourir un fichier.

Code python

>>> filin = open(‘zoo.txt’, ‘r’)
>>> for li in filin:
… print li

girafe

tigre

singe

souris

>>> filin.close()
La boucle for va demander à Python d’aller lire le fichier ligne par ligne. Privilégiez cette méthode par la suite.

         2 – Écriture dans un fichier

    Écrire dans un fichier est aussi simple que de le lire. Voyez l’exemple suivant :

Code python

>>> animaux2 = [‘poisson’, ‘abeille’, ‘chat’]
>>> filout = open(‘zoo2.txt’, ‘w’)
>>> for i in animaux2:
… filout.write(i)

>>> filout.close()
Le contenu du fichier zoo2.txt est poissonabeillechat.

Quelques commentaires sur cet exemple :

Après avoir initialisé la liste animaux2, nous avons ouvert un fichier mais cette fois-ci en mode écriture (avec le caractère w).
Ensuite, on a balayé cette liste à l’aide d’une boucle. À chaque itération, nous avons écrit chaque élément de la liste dans le fichier. Remarquez à nouveau la méthode write() qui s’applique sur l’objet filout.
Enfin, on a fermé le fichier avec la méthode close().

Vous voyez qu’il est extrêmement simple en Python de lire ou d’écrire dans un fichier.

Remarque. Si votre programme produit uniquement du texte, vous pouvez l’écrire sur la sortie standard (avec l’instruction print). L’avantage est que dans ce cas l’utilisateur peut bénéficier de toute les potentialités d’Unix (redirection, tri, parsing…). S’il veut écrire le résultat du programme dans un fichier, il pourra toujours le faire en redirigeant la sortie.

         3 – Exercices

    Conseil : pour les exercices 1 et 2, utilisez l’interpréteur Python. Pour les exercices suivants, écrivez des scripts dans des fichiers, puis exécutez-les dans un shell.

Dans l’exemple ‘girafe’, ‘tigre’, etc, ci-dessus, comment expliquer vous que Python saute une ligne à chaque itération ? Réécrivez les instructions ad-hoc pour que Python écrive le contenu du fichier sans sauter de ligne.
En reprenant le dernier exemple sur l’écriture dans un fichier, vous pouvez constater que les noms d’animaux ont été écrits les uns à la suite des autres, sans retour à la ligne. Comment expliquez-vous ce résultat ? Modifiez les instructions de manière à écrire un animal par ligne.
Dans cet exercice, nous allons utiliser une sortie partielle de DSSP (Define Secondary Structure of Proteins), qui est un logiciel d’extraction des structures secondaires. Ce fichier contient 5 colonnes correspondant respectivement au numéro de résidu, à l’acide aminé, sa structure secondaire et ses angles phi/psi.
Téléchargez le fichier first_helix_1tfe.txt sur le site du cours et sauvegardez-le dans votre répertoire de travail (jetez-y un oeil en passant).
Chargez les lignes de ce fichier en les plaçant dans une liste puis fermez le fichier.
Écrivez chaque ligne à l’écran pour vérifier que vous avez bien chargé le fichier.
Écrivez dans un fichier output.txt chacune des lignes. N’oubliez pas le retour à la ligne pour chaque acide aminé.
Écrivez dans un fichier output2.txt chacune des lignes suivies du message line checked. Encore une fois, n’oubliez pas les retours à la ligne.