10. Manipuler des fichiers

0

Dans ce chapitre, nous allons voir comment lire et écrire des fichiers en Python. On va voir comment :

  • lire des fichiers texte
  • écrire un fichier texte
  • utiliser le mot-clé with pour faciliter la gestion des fichiers

Préparation

Pour suivre ce cours, vous devrez créer un dossier input et un dossier output dans le même dossier où vous écrirez votre fichier de code Python (main.py). Dans le dossier input, il faudra que vous écriviez un fichier sample.txt contenant plusieurs lignes de texte.

Si vous souhaitez avoir le même résultat que ceux illustrés dans les exercices ci-dessous, vous pouvez copier le contenu du fichier que vous retrouverez ci-dessous :

input/sample.txt
Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua.

La lecture et l’écriture de fichiers texte

La lecture ou écriture d’un fichier se passe toujours en trois étapes. Tout d’abord, il faut ouvrir le fichier, ensuite on peut y accéder en lecture ou en écriture, et pour finir il faut fermer le fichier afin de libérer les ressources du système et de s’assurer que le contenu du fichier a bien été stocké sur le disque.

Commençons par ouvrir un fichier que j’ai préalablement créé et qui contient 4 lignes de texte. Pour cela, on va utiliser la fonction open, qui prend un chemin relatif ou absolu en premier paramètre et le mode d’ouverture en deuxième paramètre. Avant d’essayer cette fonction, expliquons ces deux paramètres.

Chemin absolu v.s. chemin relatif

Tout d’abord, quelle est la différence entre un chemin relatif et un chemin absolu?
Eh bien, un chemin absolu commence à la racine de votre système de fichiers et contient le chemin complet de la racine jusqu’au fichier que vous souhaitez ouvrir.

Imaginons qu’un fichier nommé « sample.txt » que vous souhaitez ouvrir se trouve dans un dossier « development/cours_10/input » qui se trouve lui-même à la racine de votre disque. Sous Windows, le chemin absolu aurait la forme :

Windows
C://development/cours_10/input/sample.txt

Et sous Linux ou Mac, le même chemin absolu aurait la forme :

Linux / Mac
/development/cours_10/input/sample.txt

Maintenant, imaginons que nous nous situons dans le dossier « cours_10 » et que nous souhaitions accéder à ce même fichier, mais cette fois-ci en utilisant un chemin relatif. Un chemin relatif va indiquer la position du fichier par rapport à notre position actuelle dans l’arborescence de fichiers. Donc ici, on peut utiliser le chemin relatif suivant, indépendamment de notre système d’exploitation :

Windows / Linux / Mac
input/sample.txt

Attention ! Notez bien que le chemin relatif commence directement par le nom d’un dossier ou fichier relatif à notre position actuelle ! Attention à ne pas ajouter un / ou C:// au début du chemin, sinon vous aurez un fichier absolu et non relatif !

Mode d’ouverture de fichiers

Le deuxième paramètre de la fonction open est le mode d’ouverture du fichier. Dans cette introduction, on va s’intéresser aux modes suivants :

ModeDescriptionFonctionnement
rmode de lectureSi un fichier en lecture seule n’existe pas, vous aurez une erreur.
wmode écritureSi le fichier à écrire n’existe pas, il sera créé, et s’il existe, son contenu sera écrasé.
amode append (ajout en français)Si le fichier n’existe pas, il sera créé, et s’il existe, le contenu écrit est ajouté à la fin du fichier.


À noter que si on souhaite lire et écrire, ou lire et ajouter du texte à un fichier, on peut combiner les modes et ouvrir le fichier avec les modes « rw » ou « ra », selon notre cas d’usage.

Pour ouvrir le fichier « input/sample.txt » en lecture seule, nous pouvons donc faire la chose suivante :

main.py
sample_file_path = "input/sample.txt"

sample_file = open(sample_file_path, "r")

Fermeture du fichier

Tout fichier ouvert doit être refermé une fois que nous n’en avons plus besoin, afin d’éviter des corruptions et de libérer les ressources systèmes. Pour cela, on peut utiliser la méthode close. Ajoutons-la donc tout de suite afin de ne pas l’oublier !

main.py
sample_file_path = "input/sample.txt"

sample_file = open(sample_file_path, "r")
sample_file.close()

Lecture de fichiers

Une fois notre fichier ouvert, nous allons pouvoir lire son contenu, pour cela nous pouvons utiliser différentes méthodes. La méthode read permet ainsi de charger le contenu entier du fichier dans une variable de type string. De son côté, la méthode readline permet de lire le contenu du fichier ligne après ligne, chaque appel à readline retournant la prochaine ligne du fichier. Pour finir, la méthode readlines permet de lire toutes les lignes du fichier et de les retourner sous forme de tableau de string, où chaque élément du tableau contient une ligne du fichier.

Pour lire le contenu entier de notre fichier sample.txt, on peut donc faire la chose suivante :

main.py
sample_file_path = "input/sample.txt"

sample_file = open(sample_file_path, "r")

full_content = sample_file.read()
print(full_content)

sample_file.close()

Si on exécute ce programme, on voit bien qu’on a tout le contenu du fichier sample.txt dans la variable full_content :

Si on souhaite lire les lignes l’une après l’autre avec readline, on peut faire :

main.py
sample_file_path = "input/sample.txt"

sample_file = open(sample_file_path, "r")

line = sample_file.readline()
while line:
    print(line)
    line = sample_file.readline()

sample_file.close()

Ce qui nous donne le résultat suivant :

Ici, on voit qu’on a une ligne vide entre chaque ligne de texte. Ceci est normale: le premier saut à la ligne est contenu dans la ligne qu’on a lue dans le fichier, et print ajoute son propre saut à la ligne. Une petite astuce: si vous ne souhaitez pas que print rajoute un saut à la ligne, vous pouvez ajouter le paramètre end= » » à votre print comme ceci: print(line, end= » »)

Pour finir, si on souhaite récupérer toutes les lignes sous forme de tableau, on peut faire la chose suivante :

main.py
sample_file_path = "input/sample.txt"

sample_file = open(sample_file_path, "r")

lines = sample_file.readlines()
print(lines)

sample_file.close()

Si on lance notre fichier main.py, on voit bien que le contenu du fichier est retourné sous forme de tableau :

Écriture de fichiers

Pour écrire un fichier, nous pouvons utiliser la méthode write, qui prend une chaîne de caractères à écrire dans le fichier.

Attention : si vous souhaitez ajouter des sauts à la ligne dans votre texte, vous devez les ajouter par vous-même en utilisant le caractère spécial \n

En mode écriture (« w »), nous pouvons écrire du contenu dans un fichier de la manière suivante :

main.py
output_write_path = "output/sample_write.txt"
sample_write_file = open(output_write_path, "w")

sample_write_file.write("Bonjour ! ")
sample_write_file.write("Ceci est un fichier texte.\n")
sample_write_file.write("Ceci est une deuxième ligne.")

sample_write_file.close()

En mode écriture, nous pouvons relancer notre programme autant de fois que nous le désirons, et le fichier sera écrit, puis écrasé et réécrit avec notre contenu. Le contenu du fichier output/sample_write.txt restera toujours inchangé et contiendra le texte suivant :

Écrivons maintenant un fichier en mode append (« a ») comme ceci :

main.py
output_append_path = "output/sample_append.txt"
sample_append_file = open(output_append_path, "a")

sample_append_file.write("Bonjour ! ")
sample_append_file.write("Ceci est un fichier texte.\n")
sample_append_file.write("Ceci est une deuxième ligne.")

sample_append_file.close()

Maintenant, si nous exécutons notre code trois fois, on se retrouve avec le texte ci-dessus trois fois à la suite dans notre fichier :

Le mot-clé with

Comme on le disait à l’instant, oublier de fermer un fichier peut bloquer l’accès au fichier, ou encore créer un fichier incomplet ou corrompu. Pour éviter cela, on peut utiliser un context manager, qui va se charger de fermer le fichier à notre place, et ça même en cas d’exception lors de l’exécution de notre code. En Python, on peut utiliser un contexte manager en utilisant le mot-clé with. Le mot-clé with s’utilise de la manière suivante :

with open(<file_name>, <mode>) as <variable_name>:

En résumé, l’instruction commence par le mot-clé with, suivi par l’opération d’ouverture de fichier, ensuite on a le mot-clé as, et ensuite on définit le nom de la variable qui va contenir l’objet représentant notre fichier.

Si on revient à notre exemple, on peut donc faire la chose suivante :

main.py
output_write_path = "output/sample_write.txt"
with open(output_write_path, "w") as sample_write_file:
    sample_write_file.write("Bonjour ! ")
    sample_write_file.write("Ceci est un fichier texte.\n")
    sample_write_file.write("Ceci est une deuxième ligne.")

Et si on exécute ce code, le fichier sample_write.txt a bien le bon contenu, mais cette fois-ci on n’a pas dû gérer la fermeture du fichier manuellement.

Et voilà, vous savez maintenant ouvrir et écrire des fichiers texte en Python. Dans le prochain chapitre, on verra comment gérer des exceptions afin d’éviter que nos programmes ne crashent de manière inattendue.

Laisser un commentaire