Manipulation de fichiers : kit de survie 1 Lire les lignes d`un fichier 2

Transcription

Manipulation de fichiers : kit de survie 1 Lire les lignes d`un fichier 2
Sup 841 - Lycée du parc
Python
Manipulation de fichiers : kit de survie
http://www.mp933.fr/ - [email protected]
1
Lire les lignes d’un fichier
Le principe est le suivant :
1. On ouvre un fichier.
2. On lit les lignes successivement.
3. On ferme le fichier.
En pratique :
– L’ouverture du fichier consiste à associer (via la fonction open) un objet de type file à un fichier
existant sur l’espace de stockage (le disque dur, le plus souvent). On peut voir cet objet comme
quelque chose qui pointe au début du fichier et auquel on peut demander de lire des lignes et d’en
donner le résultat 1 .
– La lecture des lignes peut se faire soit pas à pas via la méthode readline, qui lit la ligne courante
et passe à la suivante, soit globalement via la méthode readlines, qui crée l’itérateur de toutes les
lignes et permet ainsi de traiter ces dernières dans une boucle. Chaque ligne est en fait une chaîne
de caractères (string).
– On ferme le fichier via la méthode close : il est conseillé d’écrire cette instruction aussitôt après
avoir écrit l’instruction open. Si on l’oublie, la plupart du temps on ne verra pas la différence 2 .
Dans l’exemple suivant, on ouvre un fichier dont le nom est tagada.txt, on affiche la première ligne
lue, puis on calcule la somme des longueurs de toutes les lignes suivantes.
mon_fichier = open(’tagada.txt’,’r’) # ’r’ pour lecture
print(mon_fichier.readline())
s = 0
for L in mon_fichier.readlines():
s += len(L)
mon_fichier.close()
Une façon encore plus simple de parcourir les lignes d’un fichier : for L in mon_fichier: .... Cela
ressemble à la méthode readlines, à une subtile amélioration près. La séquence des lignes, qui peut être
grande, n’est pas créée avant d’être parcourue : les lignes sont lues à la volée, dès que la précédente a été
traitée.
2
Extraction des données dans une ligne
En pratique, on veut souvent séparer des informations dans les lignes lues. Typiquement, une ligne
prend la forme Sharapova,2,Russe et on veut en extraire différentes données, de différentes natures. La
méthode split fait une partie de ce travail : il suffit de lui donner comme paramètre le caractère selon
lequel on veut couper la chaîne. Une liste de chaînes est rendue :
>>> ’Sharapova,2,Russie’.split(’,’)
[’Sharapova’, ’2’, ’Russie’]
Si un fichier regroupant quelques lignes de ce type a été écrit, la lecture va réserver une mauvaise surprise :
>>> f = open(’tennis.txt’)
>>> f.readline()
’Sharapova,2,Russie\n’
1. Le principe n’est pas d’aller voir à un endroit arbitraire, contrairement à ce que l’on ferait dans un tableau.
2. Néanmoins, c’est une bonne habitude à prendre car on libère ainsi des ressources dont on n’a plus l’utilité.
1
Pour enlever les espaces et caractères d’échappement (ici, un retour à la ligne) en début et fin de ligne,
on dispose de la méthode strip, déclinable à droite et à gauche (resp. rstrip et lstrip) :
>>> ’ \n \t toto \t truc
’toto \t truc’
\n’.strip()
On reprend notre exemple tennistique :
f = open(’tennis.txt’,’r’)
for L in f:
nom, classement, nation = L.rstrip().split(’,’)
print(nom, nation, int(classement))
f.close()
Le résultat est :
(’Sharapova’, ’Russie’, 2)
(’Williams’, ’USA’, 1)
...
3
Écrire des données dans un fichier
Pour écrire dans un fichier, on commence par l’ouvrir en écriture (ce qui aura pour effet d’écraser
ledit fichier, s’il existait déjà 3 ). Ensuite, on y écrit des chaînes de caractères via la méthode write et on
termine en fermant le fichier. Attention, ici la fermeture est cruciale : c’est à cet instant que le fichier va
réellement être écrit sur le disque.
Dans l’exemple suivant, on reprend le fichier contenant des données sur des joueuses de tennis, on
récupère la liste des lignes et on ferme le fichier aussitôt après. On ouvre ensuite un nouveau fichier
dans lequel on écrit les mêmes données, mais formatées différemment (les données sont séparées par des
tabulations) :
f = open(’tennis.txt’,’r’)
liste = f.readlines()
f.close()
f = open(’tennis-bis.txt’,’w’)
for joueuse in liste: # joueuse est une chaîne de caractères
tab = joueuse.strip().split(’,’) # tab est un tableau
f.write(tab[0]+’\t’+tab[1]+’\t’+tab[2]+’\n’)
f.close()
4
Écriture par redirection de la sortie standard (très HP !)
Une autre façon d’écrire dans un fichier consiste à effectuer une redirection. La sortie standard est
le « canal »où sont dirigées les sorties telles que les affichages engendrés par print : c’est par défaut
l’interpréteur interactif, ou le shell si on a lancé un programme Python en ligne de commande. La
bibliothèque sys autorise une redirection de cette sortie standard vers un fichier. Voici comment utiliser
cette possibilité : on stocke la sortie standard dans une variable 4 . On la redéfinit ensuite comme étant
un fichier ouvert. Après les opérations, on ferme le fichier et restaure la sortie standard initiale :
import sys
old = sys.stdout
sys.stdout = open(’le_fichier_dans_lequel_je_vais_ecrire.txt’, ’w’)
<.....> print(’plouf’) <....>
sys.stdout.close()
sys.stdout = old
3. Pour écrire à la fin du fichier préexistant, prendre comme option ’a’ (pour « append ») plutôt que ’w’.
4. pour pouvoir la remettre en place à la fin
2