29. Fichiers Algorithmique & Programmation (MPSI & PCSI) Prof.
El Kourchi Khalid
Fichiers 1. Acquisition de la ressource
Un fichier est une suite d’octets réservé à l’intérieur d’un support de Puisque plusieurs applications peuvent vouloir avoir l’accès à la même
stockage. ressource, et si on leur permet tous l’accès, il se peut qu’on ait des
confusions sur la ressource.
C’est le moyen utilisé pour stocker les informations d’une façon
permanente. 2. Exploitation de la ressource
Types de Fichiers Apres avoir acquis la ressource, l’application doit l’exploiter pour la libérer
après aux autres applications qui attendent.
On manipule généralement deux types de fichiers :
3. Libération de la ressource
Fichiers textes et Fichiers binaires
Une fois l’application a fini d’exploiter la ressource, elle doit la libérer aux
Fichiers textes autres applications.
Les octets d’un fichier texte sont interprétés en une séquence de Ouverture d’un fichier (Acquisition de la ressource)
caractères.
L’ouverture d’un fichier constitue une demande d’acquisition qui peut
Beaucoup d’éditeurs permettent de manipuler ce type de fichier : bloc réussir comme elle peut échouer.
note, note pad, …
Python vient avec une fonction native « open » qui permet d’ouvrir un
Fichiers binaires fichier quelconque.
Les octets d’un fichier binaire peuvent être interprétés de differentes def open(chemin_fichier, mode_ouverture)
manieres, c’est pourquoi on trouve beaucoup differents types de fichiers
binaires (images, son, video,…)
Cette fonction accepte deux paramètres :
Pour chaque type de fichier binaire, il faut avoir une application adéquate
pour le manipuler. Chemin du fichier
Exemple Absolu, le chemin commence à partir de la racine du stockage jusqu’au
fichier.
Les éditeurs des images interprètent les octets du fichier image en des
couleurs. Exemple
C:\Users\pc-khalid\Documents\data\cpge\2014-2015\semaine20150330\piles.py
Les éditeurs des sons interprètent les octets du fichier son en des
enregistrements sonores…
Extension d’un fichier Relatif, par rapport au dossier de l’utilisateur.
Exemple
L’extension des fichiers est un moyen utilisée pour distinguer les
différents types de fichiers.
pc-khalid\Documents\data\cpge\2014-2015\semaine20150330\piles.py
On l’ajoute à la fin après le nom du fichier avec un point pour la séparer
du nom du fichier.
Mode d’ouverture
On peut ouvrir un fichier en trois modes
1. Mode lecture (‘r’ : Read)
Le fichier va être ouvert pour pouvoir seulement le lire
2. Mode écriture (‘w’ : Write)
Si le fichier existe il va être écrasé, sinon il va être créé.
3. Mode ajout (‘a’ : Append)
Si le fichier n’existe pas, il va être crée sinon il va garder son contenu et
vous pouvez y ajouter d’autre contenu.
N.B : Dans ce qui suit, on va s’intéresser uniquement aux fichiers textes. La fonction « open » retourne un objet qui est une référence sur le fichier
ouvert en mémoire.
Un fichier est une ressource
f = open(‘c:\\fichier01.txt’, ‘r’)
Les données stockées dans un fichier constituent une ressource qui peut
être requise et par la suite doit être partagée entre beaucoup
d’applications. Fermeture d’un fichier (libération de la ressource)
Pour cela on doit se munir d’une stratégie pour bien pouvoir gérer La fermeture qui est la libération de la ressource se passe simplement par
l’exploitation de ces ressources. application de la méthode « close » sur la référence « f » du fichier.
Stratégie d’utilisation d’une ressource (un fichier) f.close()
La stratégie d’utilisation d’une ressource peut être effectuée en 3 étapes :
Manipulation du fichier (Exploitation de la ressource)
Entre ouverture (acquisition) et fermeture (libération), on doit manipuler
le fichier (lire son contenu, écrire du contenu dedans)
29. Fichiers Algorithmique & Programmation (MPSI & PCSI) Prof. El Kourchi Khalid
Lecture d’un fichier Exercice 1 (Matrices)
Pour pouvoir lire un fichier, Python offre plusieurs possibilités On s’intéresse à l’écriture et à la lecture de matrices de nombres sous
différents formats. Pour chaque cas, il est demandé de créer 2 fonctions
Lire tout le contenu à la fois de lecture « lire() » et écriture « ecrire() » une matrice dans un fichier.
S = f.read() Format 1
S dans ce cas est une chaine de caractères qui contient tout le texte On commence par écrire les dimensions de la matrice sur la première
du fichier. ligne (4*12), puis on écrit une autre ligne contenant toutes les données
séparées par des virgules.
Lire un nombre précis de caractères Solution
def str2number(e):
S = f.read(num) if '.' in e:
S dans ce cas est une chaine de caractères qui contient « num » return float(e)
caractères. else:
return int(e)
Lire toutes les lignes du fichier def lireFormat1(fichier_source):
file = open(fichier_source,'r')
Lignes = f.readlines() rows,cols=[int(e) for e in file.readline().split("*")]
« Lignes » est une liste de chaine de caractères (lignes) nombres = [str2number(e) for e in file.readline().split(',')]
matrice = []
for i in range(rows):
Lire une ligne à la fois matrice.append(nombres[i*cols:(i+1)*cols])
file.close()
Ligne = f.readline() return matrice
« Ligne » est la ligne qu’on vient de lire du fichier. def listofstr(r):
return [str(e) for e in r]
Ou bien def ecrireFormat1(fichier_destination, matrice):
file = open(fichier_destination,'w')
For ligne in f : file.write("%d*%d\n" % (len(matrice),len(matrice[0])))
print(ligne) s=','.join([','.join([listofstr(r)]) for r in matrice])
Itérer sur les lignes du fichier « f » par une boucle « for » file.write(s)
file.close()
Ecriture d’un fichier texte
Format 2
La méthode « write() » permet d’écrire une chaine de caractères dans une On écrit les dimensions sur la première ligne, puis chaque ligne de la
fichier texte. matrice est écrite dans une ligne du fichier.
N.B : Elle n’ajoute pas le caractère retour en ligne ‘\n’ automatiquement. Solution
Vous devez l’ajouter explicitement. def lireFormat2(fichier_source):
file = open(fichier_source,'r')
rows,cols=[int(e) for e in file.readline().split("*")]
Exemple
lines = file.readlines()
matrice = []
Ajout dans un fichier déjà créé for line in lines:
f = open(‘pile.py’, ‘a’) matrice.append([ str2number(m) for m in line.split(',') ])
f.write(‘\n# fin du code de la pile.’) file.close()
f.close() return matrice
def ecrireFormat2(fichier_destination, matrice):
file = open(fichier_destination,'w')
Position dans un fichier texte file.write("%d*%d\n" % (len(matrice),len(matrice[0])))
s=''
for row in matrice:
Comme dans la lecture d’un livre, lorsque nous sommes en train de lire le
line = ','.join([str(n) for n in row]) + "\n"
livre on est en train de se déplacer sur le livre. C’est exactement la même file.write(line)
chose qui se passe lorsque nous sommes en train de lire un fichier par file.close()
application de l’une des méthodes de lecture.
Format 3
La méthode « tell () » nous donne la position actuelle dans le fichier.
On se contente d’écrire les lignes de la matrice sur des lignes différentes
du fichier, en séparant les éléments d’une ligne par des tabulations.
L’opération suivante sur le fichier que ce soit une lecture ou une écriture
elle va être effectuée à partir de cette position.
Format 4
On écrit la matrice sur une seule ligne, au format
f = open(«file.py », « r »)
f.tell() # retourne 0 (début du fichier) [[a(1,1),...,a(1,n)],...,[a(m,1),...,a(m,n)]].
f.readline()
f.tell() # retourne le position actuelle après la lecture de la ligne
29. Fichiers Algorithmique & Programmation (MPSI & PCSI) Prof. El Kourchi Khalid
Exercice 2 (gros fichiers) Exercice 3 (Hamlet Tragedy)
On souhaite découper un gros fichier en plusieurs petits. écrire une On trouve sans trop de mal le texte original de Hamlet sur Internet. On va
fonction « def decouper(chemin_fichier, taille_max) » qui découpera récupérer et enregistrer la version française de ce texte dans un fichier
facilement le gros fichier en des fichiers plus petits. .txt.
Découper un fichier
Ecrire une fonction qui lit le fichier et compte le nombre d’interventions
des différents protagonistes.
Si on demande de découper un fichier « c://test.txt » contenant 3500
caractères, et si l’utilisateur choisit de découper en fichiers de 1000
caractères, le résultat produit sera 4 fichiers : Solution
def interventions(infile):
« c:/test.part1.txt » de taille 1000 caractères file = open(infile, 'r')
« c:/test.part2.txt » de taille 1000 caractères inter = []
for line in file:
« c:/test.part3.txt » de taille 1000 caractères
line = line.strip()
« c:/test.part4.txt » de taille 500 caractères if line and line == line.upper() and not line.startswith('ACT '):
protagonistes = [i[0] for i in inter]
Solution if line in protagonistes:
def decouper(gros_fichier, max): i = protagonistes.index(line)
f=open(gros_fichier, 'r') inter[i][1]+=1
s=f.read(max) else:
c=1
inter.append([line, 1])
while s!='':
file.close()
# creer le fichier part pour le remplir
# par max caracteres lu du gros fichier return inter
fichier_part=gros_fichier[:-3]+'part' + str(c) + '.txt'
pf=open(fichier_part, 'w')
pf.write(s) Faire des statistiques sur le nombre de mots, de lettres, lesquels sont le
pf.close() plus utilisés, etc.
# lire les (max) caracteres suivantes
s=f.read(max) Solution
c+=1
def statistics(infile):
f.close()
file = open(infile, 'r')
stats_words = []
Reconstruire un fichier chars = [ [c, 0] for c in Majuscules ]
for line in file:
Ecrire une fonction « def reconstruire(liste_morceaux) » qui reconstruit un line = line.strip()
fichier découpé, à partir des fichiers morceaux. if line:
wds = line.split()
! La fonction doit créer un seul fichier contenant tous les données de tous for w in wds:
les fichiers à restituer. # statistics of chars
for c in w:
Solution cu = c.upper()
def reconstruire(liste_morceaux): if cu in Majuscules:
# construire le nom du gros fichier chars[Majuscules.index(cu)][1]+=1
fichier=''.join(liste_morceaux[0].split('.part1')) # statistics of words
# ouvrir le gros fichier en mode ajout words = [sw[0] for sw in stats_words]
f=open(fichier,'a') wu = w.upper()
for m in liste_morceaux: if wu in words:
pf=open(m, 'r') i = words.index(wu)
f.write(pf.read()) stats_words[i][1] += 1
pf.close() else:
f.close() stats_words.append([wu, 1])
file.close()
return chars, stats_words