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