LES FICHIERS EN PYTHON
1
Notion de Fichier - collection d’informations stockées sur une mémoire de
masse (non volatile, capacité plus importante que la mémoire vive)
Types de fichiers – Ils se distinguent par…
1. Organisation des données : structuré, les informations sont
organisées d’une manière particulière qu’il faut respecter (ex.
fichiers d’enregistrements) ; non-structuré, les informations sont
alignées à la suite (ex. fichier texte)
2. Mode d’accès aux données : accès indicé, utilisable comme un
tableau ; accès séquentiel, lecture ou écriture pas à pas
(ex. ligne par ligne dans un fichier texte)
La catégorisation n’est pas toujours très tranchée, un fichier XML par ex.
est un fichier texte (manipulable avec un éditeur de texte) mais qui obéit
à une organisation structurée
2
Accès séquentiel, non structuré
FICHIER TEXTE
3
Lecture en bloc avec read() megane
clio
# -*- coding: utf -*- Fichier texte à lire : twingo
safrane
#ouverture en lecture « [Link] » laguna
f = open("[Link]","r") vel satis
#lecture •open() permet d’ouvrir un fichier, en lecture ici
s = [Link]() avec l’option « r ». La fonction renvoie un objet de
type fichier stocké dans f
#affichage
print("** contenu de s **") • le curseur de fichier est placé sur la première ligne
print(s) • read() lit tout le contenu du fichier d’un bloc
print("** fin contenu **") • close() ferme le fichier (et donc le déverrouille)
#information sur s
print("type de s : ",type(s))
print("longueur de s : ", len(s))
#fermeture
[Link]()
s est detype«str », onserendmieuxcompteenmodeconsole:
\n représente le caractère spécial « saut de ligne » (line feed),
c’est
R.R. pour cela
– Université Lyon que
2 print(s) fonctionne correctement. 4
Lecture en bloc avec readlines (avec « s »)
# -*- coding: utf -*-
#ouverture en lecture
f = open("[Link]","r")
#lecture
lst = [Link]()
Le contenu du fichier est
#affichage stocké dans une liste, une ligne
print("** contenu de lst **")
print(lst) = un élément. Le caractère \n
print("** fin contenu **") est maintenu. Il n’est pas
#information sur lst présent sur la dernière ligne de
print("type de s : ",type(lst)) notre fichier exemple.
print("longueur de s : ", len(lst))
#fermeture
[Link]()
5
Remarque : saut de ligne ou pas sur la dernière ligne du fichier
Question : Comment savoir s’il y a un saut de ligne
Ouvrir le fichier dans Notepad++ ou pas à la dernière ligne de notre fichier texte ?
La ligne n°6 est la dernière ligne du fichier,
pas de saut ligne après « vel satis »
Il y a une ligne vide (la n°7) après « vel satis »
6
Lecture ligne par ligne avec readline (sans « s »)
# -*- coding: utf -*-
#ouverture en lecture
• readline() lit la ligne courante et
f = open("[Link]","r") place le curseur sur la ligne suivante.
#lecture ligne itérativement
•la fonction renvoie la chaîne vide
while True: lorsque nous arrivons à la fin du
s = [Link]()
if (s != ""): fichier (Remarque : s’il y a une ligne
print(s) blanche entre 2 véhicules, readline()
else:
break; renvoie le caractère « \n », ce n’est
pas une chaîne vide).
#fermeture
[Link]()
Il y a une ligne vide entre chaque véhicule parce que
le caractère « \n » est toujours là, print() le prend en
compte [ Remarque : pour que print() n’en tienne pas
compte, il faudrait faire print(s,end="") ]
7
Lecture ligne par ligne en itérant sur l’objet fichier
# -*- coding: utf -*- C’est la forme la plus efficace – et la plus
concise – pour une lecture ligne à ligne.
#ouverture en lecture
f = open("[Link]","r") Le caractère \n est présent toujours,
noter la longueur de la chaîne (+1 pour
#lecture ligne itérativement
for s in f: toutes sauf la dernière)
print(s,len(s))
#fermeture
[Link]()
8
Ecriture d’un fichier texte avec write()
# -*- coding: utf -*-
•open() permet d’ouvrir un fichier en écriture avec
l’option « w ». La fonction renvoie un objet de type
#ouverture en écriture fichier référencée par f
f = open("[Link]","w")
• avec « w », le fichier est écrasé s’il existe déjà
#écriture • write() permet d’écrire la chaîne de caractères
[Link]("honda")
[Link]("yamaha")
[Link]("ducati")
#fermeture
[Link]() Il manque les sauts de ligne pour distinguer chaque moto
# -*- coding: utf -*-
#ouverture en écriture Nous insérons le caractère saut de ligne « \n »
f = open("[Link]","w")
après chaque moto, sauf la dernière
#écriture
[Link]("honda\n")
[Link]("yamaha\n")
[Link]("ducati")
#fermeture
[Link]()
9
Ecriture d’un fichier texte avec writelines()
writelines() permet d’écrire
directement le contenu d’une liste.
Nous devons quand même insérer le
# -*- coding: utf -*- caractère « \n » pour que le saut de
#ouverture en écriture ligne soit effectif dans le fichier.
f = open("[Link]","w")
#liste
lst = ["honda\n","yamaha\n","ducati"]
#écriture
[Link](lst)
#fermeture
[Link]()
10
Ajout dans un fichier texte
• open() avec l’option « a » permet d’ouvrir
un fichier en mode ajout
• write() permet d’écrire la chaîne de
# -*- coding: utf -*- caractères
#ouverture en ajout
• attention toujours au saut de ligne
f = open("[Link]","a") • une ouverture en mode lecture / écriture
est possible avec l’option « r+ » mais se
#ajouter un saut de ligne
positionner sur telle ou telle ligne pour y
[Link]("\n")
modifier ou insérer des informations est
#écriture compliqué.
[Link]("laverda")
#fermeture
[Link]()
11
Ajout dans un fichier texte des valeurs numériques
• L’argument de la méthode write() utilisée avec
# -*- coding: utf -*-
un fichier texte doit être une chaîne de
caractères.
a = 5
b = 2.83 • Nous ne pouvons donc enregistrer d’autres
c = 67 types de valeurs qu’en les transformant d’abord
f = open('Monfichier', 'w')
[Link](str(a)) en chaînes de caractères (string).
[Link](str(b))
• Nous pouvons réaliser cela à l’aide de la
[Link](str(c))
[Link]() fonction intégrée str() :
f = open('Monfichier', 'r')
print([Link]())
52.8367
[Link]()
12
Ajout dans un fichier texte des valeurs numériques
Nous avons enregistré trois valeurs
numériques. Mais comment pouvons-nous import pickle
les distinguer dans la chaîne de caractères
résultante, lorsque nous effectuons la lecture a,b,c = 27, 12.96, [5, 4.83, « mehdi"]
du fichier ? #Ecriture dans le fichier
f =open('donnees_test', 'wb')
C’est impossible ! Rien ne nous indique [Link](a, f)
d’ailleurs qu’il y a là trois valeurs plutôt [Link](b, f)
qu’une seule, ou 2, ou 4… [Link](c, f)
[Link]()
Il existe plusieurs solutions à ce de problèmes:
L’une des meilleures consiste à importer #Lecture à partir du fichier
un module Python spécialisé : le module pickle : f = open('donnees_test', 'rb')
j = [Link](f)
k = [Link](f)
Attention : l = [Link](f)
Les fichiers traités à l’aide des fonctions du print(j, type(j))
module pickle ne seront pas des des fichiers print(k, type(k))
texte, mais bien des fichiers binaires. print(l, type(l))
[Link]()
13
Traiter un fichier texte comme un fichier binaire (fichier d’octets)
FICHIER BINAIRE
14
Accès en mode binaire (1/2) [Link]
Python peut traiter un fichier en mode binaire, il peut lire octet par octet, ou megane
clio
par blocs d’octets. Un accès indicé est possible dans ce cas. twingo
L’intérêt n’est pas flagrant pour un fichier texte, mais cette fonctionnalité safrane
ouvre la porte au traitement d’autres types de fichiers (ex. fichier image). laguna
vel satis
#ouverture enlecture
f =open("[Link]","rb")
#lire unoctet • option « rb » pour open() pour lecture et mode
a=[Link](1) binaire
print(a) • read() prend un paramètre : nb. d‘octets à lire
#type dea arraydebytes • decode() permet de transformer le tableau d’octets en
print(type(a)) chaîne de caractères, « utf-8 » est le mode d’encodage
#transformer enchaîne decaractères • après un read(), le curseur de fichier se place sur
s=[Link]("utf-8") l’octet suivant, on peut connaître la position du curseur
print(s) avec tell() [début du fichier = indice 0]
print(type(s))
b pour indiquer
#lire une2nde fois a
qu’il s’agit d’un
=[Link](1)
tableau de bytes
print(a)
#pos. ducurseur
print("position : ",[Link]())
15
Accès en mode binaire (2/2)
[Link]
#positionner le curseur megane
clio
[Link](0,0) twingo
#lire un bloc d'octets safrane
laguna
a = [Link](6) vel satis
print(a)
print("longueur = ",len(a)) •seek() permet de positionner le curseur, le 1er
#aller à l'octet n°5 paramètre est la position, le 2nd est la référence : 0 à
#à partir du début partir du début du fichier, 2 à partir de la fin, 1 à partir
[Link](5,0) de la position courante
a = [Link](1) • noter le seek(-1,2) avec un indice négatif, comme pour
print(a) les listes ou les tuples
#lire le dernier octet
[Link](-1,2)
a = [Link](1)
print(a)
#fermeture
[Link]()
16