Dans cette partie de cours, on va découvrir les fichiers en python ( Python : Les fichiers). En effet, on aura, souvent, besoin d’utilisation des fichiers comme des supports de stockage des données. Ainsi, on doit apprendre à faire les opérations classiques sur les fichiers : ouverture des fichiers, lecture des données, sauvgarde des informations…
Introduction
Tout programme ne communique pas directement avec les fichiers, mais via certaines entités abstraites qui sont nommées différemment dans différents langages ou environnements – les termes les plus utilisés sont des descripteurs ou des flux.
Le programmeur, ayant un ensemble de fonctions / méthodes plus ou moins riche, est capable d’effectuer certaines opérations sur le flux, qui affectent les vrais fichiers en utilisant des mécanismes contenus dans le noyau du système d’exploitation.
De cette façon, on peut implémenter le processus d’accès à n’importe quel fichier, même lorsque le nom du fichier est inconnu au moment de l’écriture du programme.
Ouverture d'un fichier
Pour connecter (lier) le flux au fichier, il est nécessaire d’effectuer une opération explicite. L’opération de connexion du flux avec un fichier est appelée ouverture du fichier, tandis que la déconnexion de ce lien est appelée fermeture du fichier.
L’ouverture doit être la toute première opération effectuée sur le flux.
Syntaxe : f = open(file, mode = ‘r’, encoding = None)
avec :
- file : spécifie le nom du fichier à associer au flux;
- mode (facultatif): spécifie le mode ouvert utilisé pour le flux. Le mode d’ouverture par défaut est la lecture en mode texte
- encoding (facultatif) : spécifie le type de codage (par exemple, UTF-8 lors de l’utilisation de fichiers texte). l’encodage par défaut dépend de la plateforme utilisée
- si l’ouverture réussit, la fonction open() renvoie un objet f; sinon, une exception est déclenchée
Modes d’ouverture :
Les modes d’ouverture les plus importants :
- r : Le flux sera ouvert en mode lecture(uniquement les opérations de lecture autorisées). Le fichier associé au flux doit exister et doit être lisible, sinon la fonction open() lève une exception.
- w : Le flux sera ouvert en mode écriture (uniquement les opérations d’écriture autorisées). Le fichier associé au flux n’a pas besoin d’exister ; s’il n’existe pas, il sera créé; s’il existe, il sera tronqué à la longueur de zéro (effacé); si la création n’est pas possible (par exemple, en raison d’autorisations système), la fonction open() lève une exception.
- a+ : Le flux sera ouvert en mode ajout. Le fichier associé au flux n’a pas besoin d’exister ; s’il n’existe pas, il sera créé; s’il existe, la tête d’enregistrement virtuelle sera définie à la fin du fichier (le contenu précédent du fichier reste intact).
- r+ : Le flux sera ouvert en mode lecture et mise à jour. Le fichier associé au flux doit exister et doit être accessible en écriture, sinon la fonction open() lève une exception. Les opérations de lecture et d’écriture sont autorisées pour le flux.
- w+ : le flux sera ouvert en mode écriture et mise à jour. Le fichier associé au flux n’a pas besoin d’exister; s’il n’existe pas, il sera créé; le contenu précédent du fichier reste intact. Les opérations de lecture et d’écriture sont autorisées pour le flux.
Remarque : L’ouverture du flux peut échouer pour plusieurs raisons:
- l’absence de fichier avec un nom spécifié.
- le fichier physique existe, mais le programme n’est pas autorisé à l’ouvrir.
- Le risque que le programme ait ouvert trop de flux, et le système d’exploitation spécifique peut ne pas permettre l’ouverture simultanée de plus de n fichiers (par exemple, 200).
Types de fichiers
Python suppose que chaque fichier est caché derrière un objet d’une classe adéquate. Un objet d’une classe adéquate est créé lorsqu’on ouvre le fichier et détruit au moment de la fermeture. En général, l’objet provient d’une des classes présentées ici:
La fonction open() analyse les arguments qu’on a fourni et crée automatiquement l’objet requis. l’invocation de la méthode close() coupera la connexion à l’objet et au fichier et supprimera l’objet.
En raison du type de contenu du flux, tous les flux sont divisés en texte et en flux binaires .
- Les flux de texte sont structurés en lignes; c’est-à-dire qu’ils contiennent des caractères typographiques (lettres, chiffres, ponctuation, etc.) disposés en lignes. Ce fichier est écrit (ou lu) principalement caractère par caractère ou ligne par ligne.
- Les flux binaires ne contiennent pas de texte mais une séquence d’octets de n’importe quelle valeur. Cette séquence peut être, par exemple, un programme exécutable, une image, un clip audio ou vidéo, un fichier de base de données, etc. Étant donné que ces fichiers ne contiennent pas de lignes, les données sont lues / écrites octet par octet, ou bloc par bloc, où la taille du bloc varie généralement et peut être choisie arbitrairement.
Pour ouvrir le flux :
– en mode binaire, on ajoute la lettre b à la fin de la chaîne ,
– en mode texte, on ajoute la lettre t à la fin de la chaîne
Remarque : Le mode texte est le comportement par défaut supposé quand aucun spécificateur de mode binaire / texte n’est utilisé.
Mode texte | Mode binaire | La description |
rt | Rb | Lis |
Wt | Wb | Écrire |
At | Ab | Ajouter |
r+t | r+b | Lis et MAJ |
w+t | w+b | écrire et MAJ |
Remarque : on peut également ouvrir un fichier pour sa création exclusive. on peut le faire en utilisant le mode d’ouverture x. Si le fichier existe déjà, la fonction open() lèvera une exception.
Flux pré-ouverts
On a dit que toute opération de flux doit être précédée de l’appel de la fonction open(). Il existe trois exceptions bien définies à la règle. Lorsque notre programme démarre, les trois flux sont déjà ouverts et ne nécessitent aucune préparation supplémentaire. Se sont : sys.stdin, sys.stdout et sys.stderr :
sys.stdin :
- stdin ( entrée standard)
- Le flux stdin est normalement associé au clavier, pré-ouvert pour la lecture et considéré comme la principale source de données pour les programmes en cours d’exécution;
- La fonction bien connue input()lit les données stdin par défaut.
sys.stdout :
- stdout (sortie standard)
- Le flux stdout est normalement associé à l’écran, pré-ouvert pour l’écriture, considéré comme la cible principale pour la sortie de données par le programme en cours d’exécution;
La fonction bien connue print()fournit les données au flux stdout.
sys.stderr :
- stderr (comme sortie d’erreur standard)
- le flux stderr est normalement associé à l’écran, pré-ouvert pour l’écriture, considéré comme le lieu principal où le programme en cours doit envoyer des informations sur les erreurs rencontrées lors de son travail;
Clôture des flux
La dernière opération effectuée devrait être la fermeture : f.close(). la fonction ne renvoie rien mais lève l’exception IOError en cas d’erreur;
Remarque : La fonction strerror() permet de simplifier le code de gestion des erreurs. elle provient du module os et attend un seul argument (un numéro d’erreur) .
Exemple :
from os import strerror
try:
s = open(“c:/users/user/Desktop/file.txt”, “rt”)
…..
s.close()
except Exception as exc:
print(“On n’arrive pas à ouvrir le fichier :”, strerror(exc.errno));
Traitement des fichiers texte
1- Lecture
Pour lire le contenu du fichier afin de les traiter.
f = open(“a.txt”, “rt”, encoding = “utf-8”) print(f.read()) |
La lecture du contenu d’un fichier texte peut être effectuée en utilisant plusieurs méthodes différentes :
1.1- read() :
La plus élémentaire de ces méthodes est celle offerte par la fonction read(). Si elle est appliquée à un fichier texte, la fonction est capable de:
- lire un nombre souhaité de caractères (dont un seul) dans le fichier et les renvoyer sous forme de chaîne;
- lire tout le contenu du fichier et le renvoyer sous forme de chaîne;
- s’il n’y a plus rien à lire (la tête de lecture virtuelle atteint la fin du fichier), la fonction renvoie une chaîne vide.
Exemple :
cnt = 0
s = open(‘text.txt’, “rt”)
ch = s.read(1)
while ch != ”:
print(ch, end=”)
cnt += 1
ch = s.read(1)
s.close()
print(“le nombre de caractères du fichier :”, cnt)
On peut lire le fichier entier dans la mémoire à la fois via la fonction read(), invoquée sans aucun argument ou avec un argument évalué None.
Remarque : la lecture d’un fichier de plusieurs téraoctets à l’aide de cette méthode peut corrompre votre système d’exploitation.
Exemple :
cnt = 0
s = open(‘text.txt’, “rt”)
content = s.read()
for ch in content:
print(ch, end=”)
cnt += 1
s.close()
print(“le nombre de caractères du fichier :”, cnt)
Le résultat sera exactement le même que précédemment.
1.2- readline ()
Pour traiter le contenu du fichier comme un ensemble de lignes, pas comme un groupe de caractères, on utilise la méthode readline()
La méthode essaie de lire une ligne complète de texte à partir du fichier et la renvoie sous forme de chaîne en cas de succès. Sinon, il renvoie une chaîne vide.
Exemple :
from os import strerror
try:
ccnt = lcnt = 0
s = open(‘text.txt’, ‘rt’)
ligne = s.readline()
while ligne != ”:
lcnt += 1
for ch in ligne:
print(ch, end=”)
ccnt += 1
ligne = s.readline()
s.close()
print(“le nombre de caractères du fichier :”, ccnt)
print(“le nombre de lignes du fichier “, lcnt)
except IOError as e:
print(“erreur I/O: “, strerr(e.errno))
1.3- readlines ()
La méthode readlines(), lorsqu’elle est invoquée sans arguments, essaie de lire tout le contenu du fichier et retourne une liste de chaînes, un élément par ligne de fichier .
On peut imposer à la méthode readlines() de lire pas plus d’un nombre spécifié d’octets à la fois (ajout d(un argument pour décrire la taille maximale autorisée).
Remarque: lorsqu’il n’y a rien à lire dans le fichier, la méthode renvoie une liste vide.
Exemple :
ccnt = lcnt = 0
s = open(‘text.txt’, ‘rt’)
lignes = s.readlines(20)
while len(lignes) != 0:
for ligne in lines:
lcnt += 1
for ch in ligne:
print(ch, end=”)
ccnt += 1
lignes = s.readlines(10)
s.close()
print(“\nNombre de caractères dans le fichier:”, ccnt)
print(“Nombre de lignes : “, lcnt)
Remarque : l’objet retourné par la fonction open() en mode texte est une instance de la classe itérable . Le protocole d’itération défini renvoie simplement la ligne suivante lue dans le fichier.
En outre, on peut nous attendre à ce que l’objet invoque automatiquement close()lorsque l’un des fichiers lus atteint la fin du fichier.
Exemple :
ccnt = lcnt = 0
for ligne in open(‘text.txt’, ‘rt’):
lcnt += 1
for ch in ligne:
print(ch, end=”)
ccnt += 1
print(“\nNombre de caractères dans le fichier:”, ccnt)
print(“Nombre de lignes : “, lcnt)
2- Ecriture : write ()
La méthode write() n’attend qu’un seul argument – une chaîne qui sera transférée dans un fichier ouvert. Exemple : crée un fichier nommé a.txt, puis y met dix lignes.
f = open(a.txt’, ‘wt’)
for i in range(10):
f.write( “ligne ” + str(i+1) + “\n”)
f.close()
TP
Un professeur prend régulièrement des notes dans un fichier texte. Chaque ligne du fichier contient 4 éléments: le code, le prénom, le nom et la note de l’élève. Les éléments sont séparés par des espaces. Le fichier peut ressembler à ceci:
1111 yassir alami 15
2325 Khadija idar 14.5
1865 amina ibrahimi 16
Proposer un programme qui:
- demande à l’utilisateur le nom de fichier du professeur;
- lit le contenu du fichier et l’afficher à l’écran;
- Afficher les informations du majorant.
Astuce : Utilisez un dictionnaire pour stocker les données des élèves.
Vous pouvez suivre la liste des vidéos du cours Python (Programmation ) sur notre chaine youtube : Vidéos Python (cours) , Vidéos Python (exercices).
Aussi, notre cours bien structuré est sur le site : cours python
Découvrir plus de cours
Algorithmes, base de données, merise, SQL
Python : Les fonctions
Dans cette partie de cours, on va découvrir les l’utilisation des fonctions en python (...
Les bases de l’algorithmique
I- Introduction L’ordinateur le plus puissant que vous connaissez n’est qu’un ensemble de matériaux ; Hardware...
L’héritage en programmation orientée objet
Bienvenue dans notre cours ‘Programmation orientée objet en Python’. Alors, dans cette partie de cours, on...
types de traitements dans un algorithme
Dans cette partie de cours, on va découvrir les différents types de traitements qui peuvent...