Accueil

Traduction

Tutoriel Python - sommaire

Tutoriel Python - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Les fichiers texte en Python

Je vais vous montrer dans ce chapitre comment manipuler en Python des fichiers texte (extension .txt).
En mode programmé on utilise souvent un fichier texte pour stocker des données qui seront utiles pour le lancement suivant du programme. En effet, dès que vous fermez un programme les données contenues dans les variables sont perdues.
Imaginez un jeu, il faut récupérer les scores des parties précédentes pour savoir si le joueur progresse ou pas et il faut enregistrer le dernier score dans un fichier.

Thème : la classification des espèces aquatiques

Une espèce appartient à un taxon (groupe) et un seul. Ce taxon peut être un embranchement ou une classe ou un ordre.

Contenu provisoire du fichier "taxons.txt" :

Contenu provisoire du fichier de données "especes.txt" :

Remarque : dans les deux fichiers, une donnée par ligne.

Ces deux fichiers ont été produits avec l'éditeur Notepad et encodés en ANSI.
Ainsi les lettres accentuées sont affichées proprement.

Manipuler les fichiers texte dans la console interactive

Avant de passer à la manipulation de fichiers texte en mode programmé, testons des syntaxes via le mode interactif.

Première batterie de commandes

Premières commandes

>>> import os
>>> os.getcwd()
'C:\\Python39'

Il faut activer le module "os" afin de gérer les répertoires.
Dès que vous êtes sous l'interpréteur le répertoire par défaut est celui qui contient l'exécutable de l'interpréteur : c:\Python39. La fonction os.getcwd() précise le répertoire courant.

Suite de commandes

Mes programmes et mes fichiers de données sont dans le dossier c:\python_prog. Il faut donc changer de "directory" (répertoire).
Commandes à saisir à la suite des précédentes :

os.chdir("c:/python_prog") : accès au répertoire qui contient mes programmes et fichiers.
Pour lire le contenu d'un fichier il faut l'ouvrir en lecture seule. Donc dans la fonction open() le deuxième argument doit être "r" (comme 'read').
La méthode readlines() (avec un 's') appliquée à l'objet 'file' permet de lire tout le fichier et retourne son contenu sous forme d'une liste.
Notez que chaque élément de la liste se termine par '\n' (symbole qui commande un saut de ligne).

la méthode readline() (sans 's') permet de lire la ligne courante. Après l'ouverture d'un fichier, la ligne courante est la première.
La méthode provoque aussi le déplacement du pointeur vers la ligne suivante ou EOF (End Of File).

Ouvrir un fichier texte en mode ajout

Pour pouvoir ajouter du contenu à un fichier il faut l'ouvrir en mode ajout (deuxième argument :"a").
Pour ajouter une ligne, il faut utiliser la méthode write() à l'objet de type 'file'.
La chaine ajoutée, doit contenir "\n" pour créer un saut de ligne.

Vous voyez aussi que j'ai tenté de lire un fichier ouvert en ajout ; tentative qui s'est soldé par un message d'erreur.
N'oubliez pas de fermer le fichier avec la méthode close().

Importation du module os : danger

Pour importer le module os ne tapez surtout pas la commande from os import *
En effet la fonction native open() sera alors écrasée par la fonction os.open() donc vous ne pourrez plus ouvrir de fichiers.
Il faut donc taper : import os.
On pourra écrire "open(...)" ET "os.open(...)" pour utiliser respectivement la fonction interne open() ET la fonction open() du module os.

Manipuler les fichiers de données dans le cadre de programmes

Un conseil : le programme (fichier d'extension .py) et le fichier de données traité par ce programme, doivent être de préférence dans le même répertoire. Ainsi le problème, parfois délicat, du chemin relatif sera résolu ...

Un programme qui gère un fichier associé à un jeu

Le programme lit un fichier qui contient le dernier score.
Le jeu se déroule et le score de la session est produit.
Le fichier est de nouveau ouvert pour enregistrez le nouveau score ; le contenu précédent est écrasé !

Exemple de contenu du fichier (score.txt) :

Le code

Attention le code correspondant au jeu proprement dit ne figure pas le fichier. Donc le programme génère de façon aléatoire le score de chaque partie.
Une session c'est 10 jeux, d'où la boucle.

Programme pour lire séquentiellement un fichier

Le programme ci-dessous ouvre en lecture "especes.txt" OU "taxons.txt".

Notez la nouvelle syntaxe pour ouvrir le fichier : with open(nom_fichier, "r") as fichier
Cette instruction permet d'ouvrir et de fermer un fichier de manière efficace. En effet, si pour une raison ou une autre, l'ouverture ou la lecture du fichier conduit à une erreur, l'utilisation de la syntaxe "width … open … as … garantit une fermeture effective du fichier.
L'instruction de fermeture du fichier avec cette syntaxe devient inutile !

La méthode realine() appliquée à l'objet 'file' permet de lire une ligne dans le fichier.
readline() veut dire "lire la ligne pointée". Après ouverture d'un fichier, la ligne "pointée" est la première.

Trace de l'exécution (extrait) :

Programme pour ajouter des données à l'un des deux fichiers

Il faut pouvoir mettre à jour les fichiers et en particulier y ajouter des données.

Le programme ci-dessous permet d'ajouter des lignes au fichier "especes.txt" OU "taxons.txt".

Pour ajouter des données, en fin de fichier, il faut l'ouvrir en mode "a" (comme "append").
Pour créer une nouvelle ligne dans le fichier de données il faut utiliser la méthode write() à l'objet de type 'file'.

Programme pour faire une recherche aléatoire dans l'un des deux fichiers

Le programme ci-dessous permet d'ouvrir en lecture "especes.txt" OU "taxons.txt".

Le code :

Le fichier choisi est ouvert en lecture seule.
La méthode readlines() retourne tout le contenu du fichier sous forme d'une liste.
Grâce à la fonction choice() du module random on tire au sort l'un des éléments de la liste.
Trace d'exécution :

Ouvrir un fichier en lecture - écriture

Jusqu'à présent je sais ouvrir un fichier en écriture (modes "w" ou "a") et alors je ne peux pas lire le contenu OU je l'ouvre en lecture (mode "r") et alors je ne peux pas écrire dédans ...
Je peux bien sûr, dans le même programme, enchainer plusieurs ouvertures avec un mode différent. Mais il y a plus simple : le deuxième paramètre de la méthode open() peut être égal à "r+" qui autorise la lecture et l'écriture.

Ci-dessous programme qui permet d'ouvrir "especes.txt" OU "taxons.txt".
Le contenu actuel du fichier est d'abord affiché, ainsi l'utilisateur a un "pense-bête". Puis il peut ajouter des lignes au fichier

Première version

Le programme ci-dessous ouvre en lecture/écriture "especes.txt" OU "taxons.txt".

Le code

Trace d'exécution du programme

Analyse du code

with open(nom_fichier, "r+") as fichier : le deuxième argument de la méthode open est "r+"

Critiques du code

Ce programme est souple : on peut lire tout le contenu d'un fichier et ensuite, si on le souhaite, on peut écrire dans ce fichier.
Problème : le contenu du fichier est difficile à lire à cause de symboles 'parasites' : guillemets internes, virgules internes, retour chariot. Il faudrait pouvoir supprimer ces symboles ...

Version améliorée

La méthode readlines() retourne une liste. Il faudrait pouvoir convertir cette liste en chaine. Nous avions vu dans le chapitre 8 que c'est possible grâce à la méthode join() appliquée à la liste.

Extrait du code de la nouvelle version

La liste "contenu" est convertie en chaine grâce à la méthode join(). Dans cette chaine les mots sont séparés par des " ;".
Puis on remplace les symboles "\n" -c'est à dire les retours chariot - par des espaces : emploi de la méthode replace().

La trace d'exécution

Reconnaissez que l'affichage du contenu est beaucoup plus limpide.

La méthode writelines()

La méthode writelines() permet d'ajouter d'ajouter d'un coup plusieurs lignes à un fichier.

Exemple de programme basé sur cette méthode

Analyse du code

Le fichier "especes.txt" est ouvert en mode "r+" : lecture et écritue.
On lit séquentiellement le fichier avec une boucle basée sur readline() pour afficher le contenu inital du fichier.

La variable "données" contient une liste de trois éléments, il pourrait y en avoir 30 ...
Grâce à une commande basée sur la méthode writelines(liste) le contenu de cette liste est ajouté au fichier sous forme de 3 lignes.

fichier.seek(0) : suite aux ajouts le pointeur est en EOF (End Of File) ; grâce à l'instruction "seek(0)" le pointeur sélectionne de nouveau la première ligne.
Pour terminer, on lit de nouveau séquentiellement le fichier, donc on affiche le nouveau contenu.

Récupérer les programmes et fichiers de ce chapitre

Le fichier ZIP correspondant