Les fichiers en Python

Fichiers Python

Les données utilisées dans un programme sont temporaires; sauf si les données ont été enregistrées car elles seront perdues lorsque le programme se termine. Pour stocker de façon permanente les données créées lors de l’exécution d’un programme, vous devez les enregistrer dans un fichier sur un disque ou sur un autre périphérique de stockage permanent.

Le fichier peut être transporté et peut être lu plus tard par d’autres programmes. Dans cet article, vous apprendrez à lire et écrire des données depuis et vers un fichier.

Lecture et écritures de textes

Pour lire et écrire des données depuis et/ou vers un fichier, utilisez la fonction open pour créer un objet de type fichier et utiliser les méthodes read et write pour lire et enregistrer vos données, respectivement.

Un fichier est souvent placé dans un répertoire dans le système de fichiers du système d’exploitation utilisé.

Le nom absolu d’un fichier contient le nom de fichier ainsi que son chemin complet et la lettre du lecteur correspondant. Par exemple, c:\pybook\scores.txt est le nom absolu pour le fichier scores.txt sur le système d’exploitation Windows. Ici, c:\pybook est appelé le chemin du répertoire dans le système de fichiers.

Le nom absolu d’un fichier dépend du système d’exploitation de la machine. Sur la plate-forme UNIX, le nom de fichier absolu peut être /home/cpge/pybook/Scores.txt, où /home/cpge/pybook est le chemin du répertoire du fichier scores.txt.

Un nom de fichier relatif dépend du répertoire de travail courant. Le chemin du répertoire complet pour un nom de fichier relatif est omis. Par exemple, Scores.py est un nom de fichier relatif. Si le répertoire de travail courant est c:\pybook, le nom de fichier absolu serait c:\pybook\Scores.py.

Les fichiers peuvent être classés en deux catégories: texte et binaires. Un fichier qui peut être traité (être créé, lu ou modifié) en utilisant un éditeur de texte tel que Notepad sous Windows ou vi sous UNIX est appelé fichier texte.

Tous les autres fichiers sont appelés fichiers binaires. Par exemple, les codes source de programmes Python sont stockés dans des fichiers texte et peuvent être traitées par un éditeur de texte, mais les fichiers Microsoft Word sont stockés dans des fichiers binaires et sont traitées par le programme Microsoft Word.

Bien qu’il ne soit pas techniquement précis et correcte, vous pouvez considérer un fichier texte comme étant constitué d’une séquence de caractères et un fichier binaire constitué d’une séquence de bits. Les caractères dans un fichier texte sont codés en utilisant un schéma de codage de caractères tels que ASCII et Unicode.

Les ordinateurs ne font pas la différence entre les fichiers binaires et les fichiers texte. Tous les fichiers sont stockés dans un format binaire, et donc tous les fichiers sont essentiellement des fichiers binaires. Cependant, Python vous offre un niveau d’abstraction pour l’encodage et le décodage des caractères.

Ouverture d’un fichier

Comment écrire des données dans un fichier et lire les données à partir d’un fichier? Vous devez d’abord créer un objet fichier qui est associé à un fichier physique. On appelle ça l’ouverture d’un fichier. La syntaxe pour l’ouverture d’un fichier est:

variableFichier = open(nomFichier, mode)

La fonction open retourne un objet fichier pour le nom de fichier donné. Le paramètre « mode » est une chaîne de caractères qui spécifie comment le fichier sera utilisé (pour la lecture ou l’écriture), comme indiqué dans la liste ci-dessous :

  • “r” : Ouvre un fichier pour la lecture seulement.
  • “w” : Ouvre un nouveau fichier pour l’écriture. Si le fichier existe déjà, son ancien contenu sera détruit.
  • “a” : Ouvre un fichier pour l’ajout de données à la fin du fichier.
  • “rb” : Ouvre un fichier pour la lecture de données binaires.
  • “wb” :  Ouvre un fichier pour l’écriture de données binaires.

Par exemple, l’instruction suivante ouvre un fichier nommé scores.txt dans le répertoire courant en mode ‘’lecture’’:

fichier = open("Scores.txt", "r")

Vous pouvez également utiliser le nom de fichier absolu pour ouvrir le fichier dans Windows, comme suit:

fichier = open(r"c:\pybook\Scores.txt", "r")

Cette instruction ouvre le fichier scores.txt qui se trouve dans le répertoire c:\pybook pour la lecture.

Le préfixe r avant le nom de fichier absolu indique que la chaîne est une chaîne brute, ce qui incite l’interpréteur Python à traiter les caractères anti-slash comme des caractères littéraux. Sans le préfixe r, vous devez écrire cette instruction en utilisant une séquence d’échappement comme:

fichier = open("c:\\pybook\\Scores.txt", "r")

Ecriture de données

La fonction open crée un objet fichier, ce qui est une instance de la classe _io.TextIOWrapper. Cette classe contient les méthodes destinées à la lecture et l’écriture des données et aussi à la fermeture de fichiers, comme le montre la liste suivante :

read([nombre entier]) : Renvoie le nombre spécifié de caractères à partir du fichier. Si l’argument est omis, tout le contenu restant dans le fichier sera lu et renvoyé.

readline() : Renvoie la prochaine ligne du fichier sous forme d’une chaîne de caractères.

readlines() : Renvoie la liste des lignes restantes dans le fichier non encore lues.

write(s: str) : None Ajoute la chaîne de caractère s dans le fichier.

close() : None Ferme le fichier.

Une fois qu’un fichier soit ouvert pour l’écriture de données, vous pouvez utiliser la méthode write pour ajouter une chaîne de caractères dans le fichier.

Dans le code ci-dessous, le programme écrit trois chaînes de caractères dans le fichier Matières.txt.

# Ouvrir le fichier pour l’écriture

outfile = open("Matières.txt", "w")

# Écrire des données sur le fichier
outfile.write("Informatique\n")
outfile.write("Maths\n")
outfile.write("Physique-Chimie")

outfile.close() # Fermez le fichier

Le programme ouvre un fichier nommé Matières.txt en utilisant le mode w pour écrire des données (ligne 3). Si le fichier n’existe pas, la fonction open crée un nouveau fichier.

Si le fichier existe déjà, le contenu du fichier sera remplacé par de nouvelles données. Vous pouvez maintenant ajouter des données dans le fichier.

Quand un fichier est ouvert pour l’écriture ou la lecture, un marqueur spécial appelé le pointeur de fichier est placé à l’intérieur du fichier. Une opération de lecture ou d’écriture a lieu à l’emplacement du pointeur.

Quand un fichier est ouvert, le pointeur de fichier est placé au début du fichier. Lorsque vous lisez ou écrivez des données dans le fichier, le pointeur de fichier se déplace vers l’avant.

Le programme appelle la méthode write sur l’objet fichier pour écrire trois chaines de caractères (lignes 6-8). La figure montre la position du pointeur de fichier après chaque écriture.

Pointeur Fichier Python

Le programme ferme le fichier pour que les données soient écrites dans le fichier (ligne 10). Après ce programme est exécuté, trois noms de matières sont écrits dans le fichier. Vous pouvez afficher le contenu du fichier dans un éditeur de texte, comme représenté sur la figure ci-dessous :

Contenu Fichier Python

Lorsque vous appelez la fonction print(str), la fonction insère automatiquement le caractère de retour à ligne ‘’\n’’ après l’affichage de la chaîne. Cependant, la fonction write n’insère pas automatiquement le caractère ‘’\n’’.

Par conséquent, vous devez insérer explicitement le caractère ‘’\n’’ dans le fichier chaque fois que vous voulez ajouter une nouvelle ligne.

Quand vous ouvrez un fichier existant en mode ‘’écriture’’, le contenu d’origine du fichier sera détruit/écrasé par le nouveau texte si vous tentez d’ajouter des données sans déplacer le pointeur du fichier à la fin du fichier.

Test de l’existence d’un fichier

Pour éviter que les données d’un fichier existant soient effacées par accident, vous devez tester pour voir si le fichier existe avant de l’ouvrir pour l’écriture.

La fonction isfile() dans le module os.path peut être utilisée pour déterminer si un fichier existe déjà dans le système de fichier actuel. Par exemple:

import os.path

if os.path.isfile("Matières.txt"):
   print("Matières.txt existe")

L’expression os.path.isfile(“Matières.txt”) renvoie Vrai si le fichier Matières.txt existe dans le répertoire courant.

Lecture de données

Après l’ouverture d’un fichier pour la lecture de données, vous pouvez utiliser la méthode read pour lire un nombre spécifique de caractères ou tous les caractères à partir du fichier – c’est-à-dire, à partir de la position actuelle du pointeur de fichier- et de les renvoyer sous forme de chaîne de caractères, la méthode readline() pour lire la ligne suivante, et la méthode readlines() pour lire toutes les lignes et les renvoyer sous forme d’une liste de chaînes de caractères.

Supposons que le fichier Matières.txt contient les trois lignes indiquées dans une figure ci-dessus. Le programme suivant permet de lire les données du fichier de différentes manières.

# Ouvrir le fichier en mode lecture

monFichier = open("Matières.txt", "r")
print("(1) Lire le fichier avec la méthode read(): ")
print(monFichier.read())
monFichier.close() # Fermer le fichier

# Ouvrir le fichier en mode lecture
monFichier = open("Matières.txt", "r")
print("\n(2) Ouvrir le fichier avec read(nombre): ")
s1 = monFichier.read(4)
print(s1)
s2 = monFichier.read(10)
print( repr(s2) )
monFichier.close() # Fermer le fichier

# Ouvrir le fichier en mode lecture
monFichier = open("Matières.txt", "r")
print("\n(3) Ouvrir le fichier avec readline(): ")
line1 = monFichier.readline()
line2 = monFichier.readline()
line3 = monFichier.readline()
line4 = monFichier.readline()
print(repr(line1))
print(repr(line2))
print(repr(line3))
print(repr(line4))
monFichier.close() # Fermer le fichier

# Ouvrir le fichier en mode lecture
monFichier = open("Matières.txt", "r")
print("\n(4) Ouvrir le fichier avec readlines(): ")
print(monFichier.readlines() )
monFichier.close() # Fermer le fichier

Voici le résultat de l’exécution du programme :

(1) Lire le fichier avec la méthode read():
Informatique
Maths
Physique-Chimie

(2) Ouvrir le fichier avec read(nombre):
Info
'rmatique\nM'

(3) Ouvrir le fichier avec readline():
'Informatique\n'
'Maths\n'
'Physique-Chimie'
''

(4) Ouvrir le fichier avec readlines():
['Informatique\n', 'Maths\n', 'Physique-Chimie']

Le programme ouvre d’abord le fichier Matières.txt en utilisant le mode ‘’r’’ pour la lecture à travers la variable monFichier faisant référence à un objet fichier (ligne 3).

L’appel de la méthode monFichier.read() permet de lire tous les caractères à partir du début du fichier et les renvoyer sous forme de chaîne de caractères (ligne 5). Enfin, le programme ferme le fichier à la ligne 6.

Le programme ré-ouvre le fichier en mode lecture (ligne 9), puis utilise la méthode read(nombre) pour lire un nombre spécifique de caractères à partir du fichier. L’appel monFichier.read(4) lit 4 caractères (ligne 11) et monFichier.read(10) lit 10 caractères (ligne 13).

La fonction repr(s) retourne une valeur brute pour la chaîne de caractères s, ce qui permet d’afficher les caractères spéciaux en tant caractères littéraux, comme le montre la sortie du programme. La figure suivante montre la position du pointeur du fichier après chaque lecture.

Position Pointeur Fichier Python

Le fichier est fermé (ligne 15) et réouvert en mode lecture (ligne 18). Le programme utilise la méthode readline () pour lire une ligne (ligne 20). L’appel monFichier.readline() lit une ligne qui se termine par ‘\n’.

Tous les caractères dans une ligne sont lus, y compris le ‘\n’. Lorsque le pointeur du fichier est placé à la fin du fichier, l’appel monFichier.readline() retourne une chaîne vide ”. La figure suivante montre la position du pointeur du fichier après chaque appel de la méthode readline().

Position Pointeur Fichier Python

Le fichier est fermé (ligne 28) et réouvert pour la lecture (ligne 31). Le programme utilise la méthode readlines () pour lire toutes les lignes et retourner une liste de chaînes.

Chaque chaîne correspond à une ligne dans le fichier.

Lecture de toutes les données contenues dans un fichier « d’un seul coup »

Les programmes ont souvent besoin de lire toutes les données à partir d’un fichier.

Voici deux approches communes pour accomplir cette tâche:

  1. Utilisez la méthode read() pour lire toutes les données à partir du fichier et les renvoyer sous forme d’une seule chaîne de caractères.
  2. Utilisez la méthode readlines() pour lire toutes les données et les retourner comme une liste de chaînes de caractères.

Ces deux approches sont simples et appropriés pour les petits fichiers, mais qu’est-ce qui se passe si la taille du fichier est si importante que son contenu ne peut pas être stocké dans la mémoire?

Vous pouvez écrire la boucle suivante pour lire chaque ligne dans le fichier séparément:

line = monFichier.readline() # Lire une ligne
while line != '':
   # Traiter la ligne courante ici ...
   # Lire la ligne suivante
   
   line = monFichier.readline()

Notez que lorsque le programme atteint la fin du fichier, readline () retourne ”.

Python vous permet également de lire toutes les lignes en utilisant une boucle, comme suit:

for line in monFichier:
   # Traiter la ligne courante ici ...

Ceci est beaucoup plus simple que d’utiliser une boucle while. Le code ci-dessous illustre un programme qui copie des données à partir d’un fichier source dans un fichier cible et compte le nombre de lignes et de caractères dans le fichier.

import os.path
import sys

# Demander à l'utilisateur d'entrer des noms de fichiers

f1 = input("Nom du fichier source: ").strip()
f2 = input("Nom du fichier cible: ").strip()

# Vérifier si le fichier cible existe
if os.path.isfile(f2):
   raise RuntimeError("Le fichier " + f2 + " existe déja!!!")


# Ouvrir les fichiers pour l'écriture et la lecture
source = open(f1, "r")
cible = open(f2, "w")

# Copier le fichier source dans le fichier cible
compteurLignes = compteurCar = 0
for line in source:
   compteurLignes += 1
   compteurCar += len(line)
   cible.write(line)

print(compteurLignes, "lignes et ", compteurCar, " caractères copiés")

source.close() # Fermer le fichier source
cible.close() # Fermer le fichier cible

Voici un exemple d’exécution :

Nom du fichier source: matières.txt
Nom du fichier cible: c_mat.txt
3 lignes et 34 caractères copiés

Le programme invite l’utilisateur à saisir le nom du fichier source f1 et le nom du fichier cible f2 (lignes 6-7), puis il détermine si f2 existe déjà (lignes 10-11).

Si oui, le programme affiche un message indiquant que le fichier existe déjà (ligne 11) et arrête l’exécution.

Si le fichier n’existe pas, le programme ouvre le fichier f1 en mode lecture et ouvre f2 en mode écriture (lignes 15-16).

Le programme utilise ensuite une boucle for pour lire chaque ligne du fichier f1 et l’ajouter dans le fichier f2 (lignes 20-23). En plus, le programme compte le nombre de lignes et de caractères lus (lignes 21-22).

Pour veiller à ce que les fichiers soient traités correctement, vous devez fermer les fichiers après la fin du traitement (lignes 26-27).

Ajout de données

Vous pouvez utiliser le mode ‘’a’’ pour ouvrir un fichier afin d’ajouter des données à la fin d’un fichier existant. Le programme ci-dessous donne un exemple de l’ajout de de nouvelles lignes dans un fichier nommé Info.txt.

# Ouvrir le fichier pour l'ajout de données

monFichier = open("Info.txt", "a")
monFichier.write("\n Python est une langage interprété \n")
monFichier.close() # Fermer le fichier

Le programme ouvre un fichier nommé Info.txt en utilisant le mode ‘’a’’ d’ajout de données dans le fichier par le l’objet fichier monFichier (ligne 3).

Supposons que le fichier existant contient le texte «La programmation est amusante.”, la figure ci-dessous montre la position du pointeur de fichier après que le fichier est ouvert et après chaque écriture. Lorsque le fichier est ouvert, le pointeur de fichier est placé à la fin du fichier.

Ajout Donnees Fichier Python

Le programme ferme le fichier pour garantir que les données sont correctement écrites dans le fichier (ligne 5).

L’écriture et la lecture des données numériques

Pour écrire des nombres dans un fichier, vous devez d’abord les convertir en chaînes de caractères, puis utiliser la méthode write pour les enregistrer dans le fichier.

Afin de lire des données numériques à partir d’un fichier texte, veillez à les séparer par des caractères blancs, tels que ” ” ou \ n lors de l’enregistrement.

Le programme ci-dessous ajoute dix chiffres aléatoires dans un fichier et puis les lit à partir du même fichier.

from random import randint


# Ouvrir le fichier pour en mode écriture
monFichier = open("Numbers.txt", "w")
for i in range(10):
   monFichier.write(str(randint(0, 9)) + " ")

monFichier.close() # Fermer le fichier

# Ouvrir le fichier en mode lecture
monFichier = open("Numbers.txt", "r")

s = monFichier.read()

numbers = [eval(x) for x in s.split()]

for number in numbers:
   print(number, end = " ")
monFichier.close() # Fermer le fichier

Voici le résultat d’une exécution du programme.

8 1 4 1 2 5 5 1 3 2

Le programme ouvre un fichier nommé Numbers.txt en utilisant le mode w pour écrire des données dans ce fichier en utilisant l’objet fichier monFichier (ligne 5). La boucle for écrit dix numéros dans le fichier, séparés par des espaces (lignes 6-7).

Notez que les nombres sont convertis en chaînes de caractères avant d’être écrits dans le fichier.

Le programme ferme le fichier (ligne 8) et le ré-ouvre en mode r pour la lecture de données à travers le même objet fichier monFichier (ligne 11). La méthode read () lit toutes les données sous forme de chaîne de caractères (ligne 12).

Étant donné que les chiffres sont séparés par des espaces, la méthode split() fractionne la chaîne en une liste (ligne 13). Les chiffres sont obtenus à partir de la liste et affichés (lignes 14-15).

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here