Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
En mode console ou en mode script, on peut manipuler des fichiers texte (extension .txt).
En mode programmé on utilise souvent un fichier texte pour stocker des données.
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 nouveau
score ...
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.
Avant de passer à la manipulation de fichiers texte en mode programmé, testons des syntaxes via le mode interactif.
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
Or mes programmes et mes fichiers de données sont dans le dossier c:\python_prog.
Il faut donc changer de "directory".
Commandes à saisir :
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).
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().
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 ...
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) :
Attention le code correspondant au jeu proprement dit ne figure pas le fichier.
Donc je suis génère de façon aléatoire le score de chaque partie.
Une session c'est 10 jeux, d'où la boucle.
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) :
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'.
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 :
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
Le programme ci-dessous ouvre en lecture/écriture "especes.txt" OU "taxons.txt".
with open(nom_fichier, "r+") as fichier : le deuxième argument de la méthode open est "r+"
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 ...
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.
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().
Reconnaissez que l'affichage du contenu est beaucoup plus limpide.
La méthode writelines() permet d'ajouter d'ajouter d'un coup plusieurs lignes à un fichier.
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.