Les fichiers sous Python
Rappel : Fichiers ?
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...
Organisation des données :
structuré, les informations sont organisées d'une manière particulière qu'il faut respecter (ex. fichiers CSV, XML,JSON) ;
non-structuré, les informations sont alignées à la suite (ex. fichier texte).
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)
Méthode : Accès séquentiel non structuré - Lecture d'un fichier texte
1) Lecture en bloc avec la méthode read(). Le fichier texte à lire est "voiture.txt"
# Fichier texte : «voiture.txt»
#ouverture en lecture
f = open("voitures.txt","r")
#lecture
s = f.read()
#affichage
print("** contenu de s **")
print(s)
print("** fin contenu **")
#information sur s
print("type de s : ",type(s))
print("longueur de s : ",len(s))
#fermeture
f.close()
- La fonction open() permet d'ouvrir un fichier, en lecture ici avec l'option « r » elle renvoie un objet de type fichier stocké dans \(f\);
- Le curseur de fichier est placé sur la première ligne ;
- read() lit tout le contenu du fichier d'un bloc ;
- close() ferme le fichier (et donc le déverrouille).
\(s\) est de type « str », on se rend mieux compte en mode console: \(\n\) représente le caractère spécial « saut de ligne » (line feed).
2) Lecture en bloc avec la méthode readlines() (avec « s »)
# Fichier texte : «voiture.txt»
#ouverture en lecture
f = open("voitures.txt","r")
#lecture
lst = f.readlines()
#affichage
print("** contenu de lst **")
print(lst)
print("** fin contenu **")
#information sur s
print("type de s : ",type(s))
print("longueur de s : ",len(s))
#fermeture
f.close()
3) Lecture ligne par ligne avec la méthode readline() (sans « s »)
# Fichier texte : «voiture.txt»
#ouverture en lecture
f = open("voitures.txt","r")
#lecture ligne iterativement
while True:
s = f.readline()
if (s != ""):
print(s)
else:
break;
#fermeture
f.close()
- readline() lit la ligne courante et place le curseur sur la ligne suivante ;
- La fonction renvoie la chaîne vide lorsque nous arrivons à la fin du fichier
s'il y a une ligne blanche entre 2 véhicules, readline() renvoie le caractère « \(\n\) », ce n'est pas une chaîne vide ;
- 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="")
4) Lecture ligne par ligne en itérant sur l'objet fichier
# Fichier texte : «voiture.txt»
#ouverture en lecture
f = open("voitures.txt","r")
#lecture ligne iterativement
for s in f:
print(s,len(s))
#fermeture
f.close()
Méthode : Accès séquentiel non structuré - Écriture d'un fichier texte
1) Écriture avec la méthode write()
#ouverture en ecriture
f = open("moto.txt","w")
#ecriture
f.write("honda")
f.write("yamaha")
f.write("ducati")
#fermeture
f.close()
- open() permet d'ouvrir un fichier en écriture avec l'option « w ». La fonction renvoie un objet de type fichier référencée par \(f\);
- avec « w », le fichier est écrasé s'il existe déjà ;
- write() permet d'écrire la chaîne de caractères.
Dans le fichier moto.txt qui est créé il manque les sauts de ligne pour distinguer chaque moto. Comment faire ?
2) Écriture avec la méthode writelines()
#ouverture en ecriture
f = open("moto.txt","w")
#liste
lst = ["honda\n","yamaha\n","ducati"]
#ecriture
f.writelines(lst)
#fermeture
f.close()
writelines() permet d'écrire directement le contenu d'une liste.
Nous devons quand même insérer le caractère « \(\n\) » pour que le saut de ligne soit effectif dans le fichier.
3) Ajout dans un fichier texte
#ouverture en ajout
f = open("moto.txt","a")
#ajouter un saut de ligne
f.write("\n")
#ecriture
f.write("laverda")
#fermeture
f.close()
- open() avec l'option « a » permet d'ouvrir un fichier en mode ajout ;
- write() permet d'écrire la chaîne de caractères, attention toujours au saut de ligne ;
- une ouverture en mode lecture / écriture est possible avec l'option « r+ » mais se positionner sur telle ou telle ligne pour y modifier ou insérer des informations est compliqué.
Complément : Accès en mode binaire
#ouverture en lecture
f = open("voitures.txt","rb")
#lire un octet
a = f.read(1)
print(a)
#type de a : array de bytes
print(type(a))
#transformer en caracteres
s = a.decode("utf-8")
print(s)
print(type(s))
#lire une 2nde fois
a = f.read(1)
print(a)
#pos. du curseur
print("position : ",f.tell())
- seek() permet de positionner le curseur, le 1er paramètre est la position, le 2nd est la référence : \(0\) à partir du début du fichier, \(2\) à partir de la fin, \(1\) à partir de la position courante ;
- noter le seek(-1,2) avec un indice négatif, comme pour les listes ou les tuples.
#ouverture en lecture
f = open("voitures.txt","rb")
#positionner le curseur
f.seek(0,0)
#lire un bloc d'octets
a = f.read(6)
print(a)
print("longueur = ",len(a))
#aller à l'octet 5 a partir du debut
f.seek(5,0)
a = f.read(1)
print(a)
#lire le dernier octet
f.seek(-1,2)
a = f.read(1)
print(a)
#fermeture
f.close()