Gestion des fichiers en Python

publicité
Lycée Victor Hugo
MPSI-PCSI 2016-2017
Gestion des fichiers en Python
Pourquoi des fichiers ?
Lorsqu’on écrit un programme, une fois pyzo refermé, tous les résultats des traitements sont perdus.
Un moyen souvent utilisé pour sauvegarder ces données (et les réutiliser plus tard) consiste à les écrire
dans un fichier. Pour nous, les fichiers seront uniquement des textes donc les données stockées sous
forme d’une chaîne de caractères.
I
Fichiers, répertoires, chemins
1
Notion de chemin
Les fichiers sont rangés dans une structure arborescente : tout en haut se trouve la racine ; les
noeuds de l’arbre sont des répertoires ou des fichiers et un répertoire peut contenir des fichiers ou des
(sous-)répertoires. Un fichier est un noeud terminal, également appelé une feuille de l’arbre.
Un fichier particulier est identifié par un unique chemin (dit absolu) qui est une chaîne de caractères décrivant sa position dans le système de fichiers. Ce chemin décrit la succession des noeuds
à suivre pour parvenir au fichier voulu. Sa présentation suit une présentation imposée : le chemin,
en windows commence par un numéro de volume (C :, D : etc...) et rien de tel sous linux. Ensuite
on trouve la succession des répertoires qui mènent au fichier, à partir de la racine. Sous windows, le
séparateur est l’antislash (ou backslash) \, sous linux c’est le slash .
Exemple : en windows "C:\User\cpge\perso\foo.txt" et sous linux "/home/cpge/perso/foo.txt".
Python a par ailleurs le concept de répertoire de travail courant. Il est alors possible de préciser
la position d’un fichier par rapport à ce répertoire courant : on parle de chemin relatif. Par exemple
si le répertoire de travail est /home/cpge et que ce répertoire contient un répertoire perso dans lequel
on trouve le fichier foo.txt, on pourra faire référence à foo.txt, par le chemin relatif (sous-entendu
par rapport au répertoire de travail courant) perso/foo.txt
À RETENIR : • Les fichiers sont rangés dans une structure arborescente.
• Un chemin est une chaîne de caractères décrivant une position (d’un fichier ou d’un répertoires)
dans le système de fichiers, en donnant la succession des noeuds (ou noms des répertoires) à suivre
pour parvenir à l’endroit voulu.
2
Opérations utiles
Python offre un module os (comme Operating System), qui permet au travers de fonctions python de réaliser toutes les opérations que l’on peut faire directement avec le système d’exploitation :
changement de répertoire, récupération de la liste des fichiers, création de répertoire, etc...
Après avoir importé le module os en lui donnant un nom (sinon certaines fonctionnalités dont open
seront écrasées par celles de même nom issues du module os) par la syntaxe habituelle import os as OpSys ,
on a accès aux fonctions :
• getcwd(), sans argument, renvoie la chaîne de caractères donnant le chemin du répertoire de
travail courant (Current Working Directory).
• chdir(newchemin) change le répertoire courant en celui dont le chemin newchemin est passé en
argument, sous forme d’une chaîne de caractères (CHange et DIRectory).
II
1
Manipulation des données d’un fichier
Principe général
Pour travailler avec un fichier en python, on utilise un descripteur de fichier, accessible à l’aide
de la fonction open, qui permet (via le choix d’un paramètre) d’ouvrir un fichier existant pour le lire,
1
Lycée Victor Hugo
MPSI-PCSI 2016-2017
de créer un fichier (et de l’écraser s’il existe déjà), d’écrire, en complément, à la fin d’un fichier.
Une fois que l’on dispose du descripteur de fichier, on pourra, suivant les cas, lire ou écrire des
données dans le fichier. Les traitements désirés ont été réalisés il faut impérativement fermer le fichier.
:
— ouverture via monfichier=open(cheminfichier, arg)
— traitements ;
— fermeture via monfichier.close()
On crée le descripteur de fichier nommé monfichier en ouvrant le fichier dont le chemin (jusqu’au
nom inclus) est donné par la chaîne de caractères cheminfichier,
- en lecture seule avec le paramètre arg valant le caractère "r" (read),
- en écriture seule avec la valeur "w" (write) du paramètre arg. Le fichier est créé s’il n’existe pas,
et "écrasé" sinon i.e. son contenu sera perdu et remplacé par ce que l’on va écrire.
- en mode ajout avec le paramètre arg valant le caractère "a" (append). Ce qui sera écrit sera
ajouté à la fin du fichier texte existant (ou créé s’il n’existait pas).
On ferme le descripteur monfichier par la méthode close.
En résumé (à retenir)
2
Lecture d’un fichier
Pour lire le fichier ( donc ouvert avec l’argument "r") dont le descripteur est monfichier, on peut :
• récupérer la totalité du fichier en une seule instruction par monfichier.read(). Cette méthode
read appelée sur le descripteur de fichier monfichier renvoie la chaîne de caractères correspondant à
la totalité du fichier (symboles de codage fin de lignes (\n), de tabulations (\t), etc inclus).
• récupérer une liste dont les élément sont les lignes du fichier (symboles de codage de fin de ligne
inclus) par monfichier.readlines()
• récupérer le contenu du fichier ligne par ligne via monfichier.readline() ; on n’a donc qu’une
seule ligne du fichier en mémoire, a priori, à un instant donné. L’instruction monfichier.readline()
renvoie la ligne courante du fichier (chaîne de caractères) et se positionne au début de la ligne suivante
donc renvoie une chaîne vide quand on est en fin de fichier.
Il n’y a pas de "s" à la fin du nom de la méthode, ce qui correspond bien à un traitement ligne par ligne
et non de toutes les lignes comme l’instruction précédente. Comme on ne sait pas a priori combien il
y a de lignes dans le fichier, on utilisera des boucles conditionnelles (while).
• utiliser le descripteur monfichier comme un itérateur sur les lignes du fichier. L’instruction
for element in monfichier permet de parcourir le fichier initial ligne à ligne, la variable element
prenant successivement comme valeur la chaîne de caractères correspondant à chaque ligne du fichier.
Pour un très gros fichier, il n’est pas envisageable de charger tout son contenu en mémoire ; les
deux premières possibilités ne sont inutilisables. Les deux premières instructions font aussi évoluer le
placement en fin de fichier.
La méthode split (=fendre). L’instruction texte.split(carac) renvoie la liste des chaînes de caractères obtenue en découpant la chaîne de caractères texte à chaque apparition de la chaîne de
caractères carac.
Par exemple, avec texte="Les étudiants de CPGE sont fatigués", le résultat de l’instruction
texte.split(" ") est la liste [’Les’, ’étudiants’, ’de’, ’’, ’CPGE’, ’sont’, ’fatigués’]
(les espaces ont disparus et il y avait un double espace avant CPGE).
3
Ecriture
Pour l’écriture (donc on aura ouvert avec l’argument "w" ou "a"), on utilise l’instruction
monfichier.write(texte) qui écrit la chaîne de caractères texte à la fin du fichier (donc si on
souhaite écrire sur des lignes différentes, il faut introduire le codage d’un passage à la ligne).
2
Téléchargement