2.1. Manipulation de fichiers

Nous savons enregistrer des valeurs dans la mémoire vive de l’ordinateur grâce aux variables. Les accès à la mémoire vive se font très rapidement, ce qui la rend particulièrement adaptée pour stocker les données d’exécution d’un programme. Cependant, à cause de sa volatilité et de sa capacité plutôt limitée, il est parfois nécessaire d’accéder à la mémoire de masse de l’ordinateur. Les opérations de lecture et d’écriture vers celle-ci sont plus lentes, mais les données y sont persistantes et sont donc préservées même si le programme qui les a écrites s’interrompt ou si l’appareil est éteint. Nous allons voir comment il est possible de lire et d’écrire dans les fichiers de l’ordinateur depuis les programmes Python afin de manipuler des données persistantes.

L’accès à un fichier se déroule en trois étapes.

  1. Tout d’abord, on ouvre le fichier à l’aide de son chemin d’accès (sa localisation sur le disque).

  2. Dans un deuxième temps, on va lire le fichier ou y écrire de nouvelles données.

  3. Finalement, on referme le fichier.

2.1.1. Ouvrir et refermer un fichier

Les fichiers sont ouverts grâce à la fonction open(), à laquelle on fournit en paramètre le chemin d’accès vers le fichier sous forme de chaîne de caractères. La fonction renvoie un objet fichier que l’on doit stocker dans une variable.

Il est également possible de préciser le mode d’accès au fichier en fournissant un caractère comme second paramètre de la fonction open(). Voici la liste des différents modes.

Modes d’accès aux fichiers

Caractère

Mode d’accès

'r'

mode lecture (par défaut) : le fichier doit exister sur le disque

'w'

mode écriture : crée un nouveau fichier s’il n’existe pas et en efface le contenu s’il existe

'a'

mode ajout : similaire à 'w' mais écrit à la fin du fichier s’il existe au lieu d’en effacer le contenu

'x'

mode création exclusive : similaire à 'w' mais ne fonctionne que si le fichier n’existe pas encore

Il est également possible d’ouvrir un fichier en lecture et en écriture. Le mode 'r+' ajoute la possibilité d’écrire dans un fichier ouvert en lecture, alors que les modes 'w+' et 'a+' permettent de lire également un fichier un fichier ouvert en écriture.

Lorsque toutes les opérations de lecture et d’écriture souhaitées ont été effectuées sur le fichier, il est important le refermer. Cette opération peux être réalisée à l’aide de la méthode close(), comme illustré ci-dessous.

# on ouvre en mode lecture le fichier "foo.txt" dans le répertoire courant
file1 = open("foo.txt", 'r')
# on ouvre un fichier en mode création exclusive en spécifiant son chemin complet
file2 = open("~/programmes-python/bar.py", 'x')

# opérations sur les fichiers...

# finalement, une fois les opérations sur les fichiers terminées, on les ferme
file1.close()
file2.close()

Cette façon de programmer n’est cependant pas la plus recommandée car, si une erreur interrompt le programme pendant les opérations sur les fichiers, il se peut que ceux-ci ne soient pas correctement refermés. Pour éviter ce problème, nous utilisons le mot réservé with qui sert précisément à s’assurer que l’objet file soit proprement refermé à la fin du bloc d’instruction qui suit. Cette opération s’effectue automatiquement, même en cas d’erreur, et il est donc inutile d’utiliser la méthode close().

with open("test.txt", 'w') as file:
    # opérations sur le fichier `file`...
    pass

# ici, le fichier a été refermé, l'objet `file` n'existe plus

Enfin, il est conseillé de préciser en paramètre l’encodage de caractères au moment d’ouvrir les fichiers, car il dépend du système d’exploitation de l’ordinateur et peut poser des problèmes de compatibilité et de reproductibilité sur d’autres ordinateurs. En général, l’encodage à privilégier pour le texte est 'utf-8'.

with open("test.txt", 'w', encoding='utf-8') as file:
    # opérations sur le fichier `file`...
    pass