Lecture et écriture dans un fichier
Les chemins de fichiers
Il y a deux façons de décrire l'emplacement d'un fichier : son chemin absolu ou son chemin relatif :
-
Son chemin absolu décrit l'intégralité des dossiers (ou répertoires1) menant au fichier, peu importe le répertoire courant, depuis un répertoire dit « racine ». Sous Windows, la racine est le nom de volume (C:\, D:\…), sous les systèmes de la famille Unix, c'est « / ».
-
Son chemin relatif décrit la succession de répertoires à parcourir en prenant comme point de départ le répertoire courrant dans lequel on se trouve.
Exemple : Quel est le chemin du fichier explorer.exe
dans l'arborescence suivante ?
graph TD
A[C:] --> B;
A --> C[Program Files];
B[Windows] --> D{{explorer.exe}};
B --> E{{notepad.exe}};
A --> F["Program Files(x86)"];
A --> G[Users];
-
Son chemin absolu est
C:\Windows\explorer.exe
. -
Son chemin relatif dépend du répertoire courant2, par exemple :
Répertoire courant | Chemin relatif |
---|---|
Windows | explorer.exe |
C: | Windows\explorer.exe |
Program Files | ..\Windows\explorer.exe 3 |
Python reconnait indifféremment les chemins indiqués avec backslash (norme Windows) « \
» qu'avec slash « /
» (norme Unix et protocoles Internet).
f = open() et f.close()
Pour lire ou écrire dans un fichier depuis un programme Python, il faut d'abord ouvrir le fichier. On utilise la fonction open()
qui prend pour paramètre le chemin (absolu ou relatif) du fichier et le mode d'ouverture :
'r'
pour ouvrir un fichier existant en mode lecture (read-only) est l'option par défaut.'w'
en mode écrite (write) pour écrire dans un nouveau fichier (ou écraser un fichier déjà existant).'a'
en mode ajout (append) pour écrire à la fin d'un fichier déjà existant (ou le créer s'il n'existe pas).
On peut compléter le mode d'ouverture avec b
pour un fichier binaire (image ou son par exemple), on obtient rb'
, 'wb'
, 'ab'
.
On ne peut pas ouvrir en mode lecture un fichier qui n'existe pas.
f = open('fichier.txt', 'r')
>>> Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'fichier.txt'
Par contre, en mode écriture 'w'
ou ajout 'a'
, si le fichier n'existe pas quand il est ouvert, alors il est créé.
Si « fichier.txt » ne se trouve pas dans le répertoire du programme Python, il faut donner son chemin pour y accéder avec /
ou \\
.
Attention, il faut toujours fermer un fichier après l'avoir ouvert4. La méthode à utiliser est
close()
.
with open() as f:
Une autre façon d'ouvrir « fichier.txt » est d'utiliser la construction suivante :
Dans ce cas-là, le fichier est automatiquement fermé à la fin du bloc d'instructions (attention à l'indentation), il n'y a pas besoin de le fermer, cela évite beaucoup d'erreurs.
Écrire dans un fichier
Pour écrire dans un fichier, on utilise la méthode .write()
en lui passant en paramètre une chaîne de caractères à écrire5. Pour écrire des nombres il faut les convertir en str
avant.
Créons un fichier qui contient des noms de pays avec leur capitale et leur population :
Noter le caractère « \n
» pour indiquer un retour à la ligne. On peut ouvrir pays.txt
par exemple avec le blocnote et vérifier que le texte a bien été écrit.
On peut ensuite écrire deux autres lignes à la suite en mode 'a'
.
On peut maintenant ouvrir le fichier texte dans un éditeur de texte quelconque :
Noter qu'en utilisant l'instruction
f = open('pays.txt', 'a')
, rien n'est écrit dans le fichier si on oublie de fermer le fichier avec f.close()
!
Exercice corrigé
Ecrire un programme qui crée un fichier 'parite.txt' contenant tous les nombres entre 0 et 100 suivis de pair ou impair :
Réponse
Lire un fichier
Il ewiste plusieurs approches pour lire les données dans un fichier.
La méthode .read()
La méthode .read()
renvoie l'intégralité du fichier dans une chaine de caractères :
À noter, le fichier n'est lu qu'une seule fois avant d'être refermé. Par exemple, suite au programme :
data2
sera une chaîne de caractères vide. Après le premier read()
, l'interpréteur Python est arrivé au bout du fichier. Il ne recommence pas à le lire depuis le début et le second read()
ne lit plus rien. Pour recommencer à lire au début du fichier, il faut le fermer et le rouvrir.
La méthode .readline()
La méthode .readline()
permet de lire une seule ligne d'un fichier
À noter, une fois la première ligne lue, l'instruction
.readline()
suivante lit la seconde ligne et ainsi de suite jusqu'à la fin du fichier. Pour recommencer au début du fichier il faut fermer et rouvrir le fichier :
f = open('pays.txt', 'r')
ligne1 = f.readline() # première ligne du fichier
ligne2 = f.readline() # deuxième ligne du fichier
f.close()
Attention donc à ne pas confondre
readline()
qui renvoie une seule ligne dans une chaîne de caractères, avec readlines()
qui renvoie un tableau de toutes les lignes.
La boucle for… in …
Une boucle for… in …
permet d'itérer sur toutes les lignes d'un fichier.
Ici, la variable ligne
est une chaine de caractère qui prend la valeur de chaque ligne de pays.txt
.
Exercice corrigé
« Green Eggs and Ham is one of Seuss's "Beginner Books", written with very simple vocabulary for beginning readers. The vocabulary of the text consists of just 50 words and was the result of a bet between Seuss and Bennett Cerf, Dr. Seuss's publisher » Source : Wikipedia.
Ecrire un programme pour vérifier si Dr. Seuss a gagné son pari d'écrire un livre en utilisant moins de 50 mots dans son livre : https://www.clear.rice.edu/comp200/resources/texts/Green%20Eggs%20and%20Ham.txt
Aide : Utiliser les méthodes .lower()
pour convertir une chaîne de caractères en minuscule, .replace()
pour rempalcer les les signes de ponctuation (. , - ! et ? ) par des espaces, et .split()
pour séparer les mots dans une chaîne de caractères.
Réponse
mots_utilises = {} #dictionnaire des mots utilisés et de leur nombre d'occurence
with open('green eggs and ham.txt', 'r') as f:
texte = f.read()
texte = texte.lower() # met le texte en minuscule
# supprime la ponctuation
for c in '.,-!?':
texte = texte.replace(c, ' ')
# sépare les mots du texte dans un tableau de str
mots = texte.split()
# ajoute et compte les mots dans le dictionnaire mots_utilises
for m in mots:
if m not in mots_utilises:
mots_utilises[m] = 1
else:
mots_utilises[m] += 1
print(len(mots_utilises))
-
Depuis Windows 7, le terme « dossier » remplace « répertoire » ↩
-
En Python, on peut déterminer le répertoire courant avec l'instruction
↩getcwd()
du moduleos
(noter le double\\
dans la chaîne de caractère pour ‘échapper' le caractère\
) -
«
..
» désigne le répertoire parent. ↩ -
On peut essayer de supprimer un fichier ouvert depuis Windows explorer pour s’en convaincre. ↩
-
write()
renvoie le nombre de caractères qui ont été écrits dans le fichier, utile par exemple pour vérifier que le fichier contient bien le texte qu'on y a écrit. ↩