Les fichiers sous Python

RappelFichiers ?

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 CSV, XML,JSON) ;

    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)

MéthodeAccè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"

1
# Fichier texte : «voiture.txt»
2
3
#ouverture en lecture
4
f = open("voitures.txt","r")
5
6
#lecture
7
s = f.read()
8
9
#affichage
10
print("** contenu de s **")
11
print(s)
12
print("** fin contenu **")
13
14
#information sur s
15
print("type de s : ",type(s))
16
print("longueur de s : ",len(s))
17
18
#fermeture
19
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 »)

1
# Fichier texte : «voiture.txt»
2
3
#ouverture en lecture
4
f = open("voitures.txt","r")
5
6
#lecture
7
lst = f.readlines()
8
9
#affichage
10
print("** contenu de lst **")
11
print(lst)
12
print("** fin contenu **")
13
14
#information sur s
15
print("type de s : ",type(s))
16
print("longueur de s : ",len(s))
17
18
#fermeture
19
f.close()

Le contenu du fichier est stocké dans une liste, une ligne = un élément. Le caractère \(\n\) est maintenu.Il n'est pas présent sur la dernière ligne de notre fichier exemple.

3) Lecture ligne par ligne avec la méthode readline() (sans « s »)

1
# Fichier texte : «voiture.txt»
2
3
#ouverture en lecture
4
f = open("voitures.txt","r")
5
6
#lecture ligne iterativement
7
while True:
8
    s = f.readline()
9
    if (s != ""):
10
        print(s)
11
    else:
12
        break;
13
        
14
#fermeture
15
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

1
# Fichier texte : «voiture.txt»
2
3
#ouverture en lecture
4
f = open("voitures.txt","r")
5
6
#lecture ligne iterativement
7
for s in f:
8
    print(s,len(s))
9
10
#fermeture
11
f.close()

C'est la forme la plus efficace – et la plus concise – pour une lecture ligne à ligne.

Le caractère \(\n\) est présent toujours, noter la longueur de la chaîne (+1 pour toutes sauf la dernière)

Comment savoir s'il y a un saut de ligne ou pas à la dernière ligne de notre fichier texte ?

MéthodeAccès séquentiel non structuré - Écriture d'un fichier texte

1) Écriture  avec la méthode write()

1
2
#ouverture en ecriture
3
f = open("moto.txt","w")
4
5
#ecriture
6
f.write("honda")
7
f.write("yamaha")
8
f.write("ducati")
9
10
#fermeture
11
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()

1
2
3
#ouverture en ecriture
4
f = open("moto.txt","w")
5
6
#liste
7
lst = ["honda\n","yamaha\n","ducati"]
8
9
#ecriture
10
f.writelines(lst)
11
12
#fermeture
13
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

1
2
3
#ouverture en ajout
4
f = open("moto.txt","a")
5
6
#ajouter un saut de ligne
7
f.write("\n")
8
9
#ecriture
10
f.write("laverda")
11
12
#fermeture
13
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émentAccès en mode binaire

Python peut traiter un fichier en mode binaire, il peut lire octet par octet, ou par blocs d'octets. Un accès indicé est possible dans ce cas.

L'intérêt n'est pas flagrant pour un fichier texte, mais cette fonctionnalité ouvre la porte au traitement d'autres types de fichiers (ex. fichier image).

1
2
#ouverture en lecture
3
f = open("voitures.txt","rb")
4
5
#lire un octet
6
a = f.read(1)
7
print(a)
8
9
#type de a : array de bytes
10
print(type(a))
11
12
#transformer en caracteres
13
s = a.decode("utf-8")
14
print(s)
15
print(type(s))
16
17
#lire une 2nde fois
18
a = f.read(1)
19
print(a)
20
21
#pos. du curseur
22
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.

1
2
#ouverture en lecture
3
f = open("voitures.txt","rb")
4
5
#positionner le curseur
6
f.seek(0,0)
7
8
#lire un bloc d'octets
9
a = f.read(6)
10
print(a)
11
print("longueur = ",len(a))
12
13
#aller à l'octet 5 a partir du debut
14
f.seek(5,0)
15
a = f.read(1)
16
print(a)
17
18
#lire le dernier octet
19
f.seek(-1,2)
20
a = f.read(1)
21
print(a)
22
23
#fermeture
24
f.close()