PTSI2 2015/2016 Info Lycée La Martinière-Monplaisir Lyon Ch 6. Manipulation de fichiers. Nous allons apprendre comment manipuler des fichiers texte à l aide de Python ; plus précisément, on pourra extraire le contenu de fichiers existants et créer de nouveau fichiers. Cela permet par exemple de traiter un grand nombre de données qui seraient stockées dans un fichier préexistant, ou de sauvegarder un grand nombre de résultats dans un nouveau fichier. 1 Mode lecture Le principe est le suivant : On ouvre un fichier. On récupère les lignes du fichier pour pouvoir les manipuler. On ferme le fichier. 1.a Ouverture et fermeture d un fichier en mode lecture On dispose d un fichier texte préexistant, par exemple fichier_texte.txt, se trouvant dans le même répertoire que votre fichier python. On "ouvre" alors le fichier texte en mode "lecture" dans le fichier python avec l instruction : f = open( fichier_texte.txt, r ) # r comme read = lecture f est alors un objet python : on peut le voir comme un curseur qui pointe au début du fichier et auquel on peut demander de "lire" les lignes (c.f. après). Les lignes seront des chaînes de caractères (de type string). Une fois le traitement des données effectué, 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, mais pas toujours... Remarques L encodage des fichiers diffère selon le système d exploitation. S il y a des problèmes lors de la manipulation des fichiers, on peut imposer un encodage UTF8 en écrivant : open( fichier_texte.txt, r, encoding= utf8 ) Le fichier texte doit se trouver dans le même répertoire que le fichier python que vous êtes en train d écrire ; s il se trouve dans un autre répertoire, on peut indiquer le chemin complet du fichier texte : par exemple open( chemin/fichier_texte.txt, r ). On peut aussi traiter des fichiers au format csv, fichiers texte destinés à être lus par un tableur. 1
1.b Lecture séquentielle Entre les instructions f = open... et, on peut récupérer les lignes du fichier dans une liste à l aide de l instruction suivante : La variable les_lignes contient la liste des lignes du fichier. Chaque élément de la liste est une chaîne de caractères. Ainsi, les_lignes[0] contient la première ligne du fichier. Prenons par exemple le fichier contenant le texte suivant, ici ouvert dans un éditeur de texte : S il a bien été ouvert avec f = open..., l exécution de puis print(les_lignes) donnera : Python shell ["Mon aimée adorée avant que je m en aille\n", Avant que notre amour triste défaille\n, "Râle et meure ô m amie une fois\n", Il faut nous promener tous les deux seuls dans les bois\n, "Alors je m en irai plus heureux que les rois."] Exercice : Créer le mot obtenu en accolant les premières lettres de chaque ligne 1. Remarque : On peut aussi lire ligne par ligne avec la syntaxe suivante (mais l utilisation de f.readlines() est préférable) : for ligne in f: print(ligne) 1. Le texte en question est un poème d Apollinaire, c est un acrostiche : les premières lettres de chaque ligne forment un mot. 2
2 Ecriture dans un fichier Pour écrire dans un fichier, on l ouvre et on le ferme de la même manière, sauf qu on met l option w (pour write ) au lieu de r. On peut alors écrire dans le fichier à l aide de la méthode write. L instruction sera f.write( texte à écrire ) Attention : Lorsqu on fait f = open( fichier.txt, w ) puis : si fichier.txt n existait pas auparavant, il est créé ; s il existait déjà, il est écrasé! Pour écrire à la suite d un fichier préexistant, on peut utiliser a (pour append ). Expliquons par exemple ce que permet de faire le fichier python suivant : f = open( toto.txt, w ) f.write( Trois petits chats\n ) f.write( Chapeau de paille\n ) f = open( toto.txt, a ) f.write( Paillasson\n ) # Le caractère \n permet le retour à la ligne Après exécution de ces lignes, on ouvre le fichier toto.txt dans un éditeur de textes quelconque : On peut aussi constater la modification en exécutant le script suivant : f = open( toto.txt, r ) print(les_lignes) Ce qui donne dans le shell : Python shell [ Trois petits chats\n, Chapeau de paille\n, Paillasson\n ] 3
3 Un exercice Nous disposons d un fichier texte poeme.txt : On écrit, dans un fichier python (.py) qui se trouve dans le même dossier : f = open( poeme.txt, r ) print(les_lignes) À l exécution, cela donne : Python shell [ Que j aime à faire apprendre un nombre utile aux sages!\n, Glorieux Archimède, artiste, ingénieur,\n, Toi de qui Syracuse aime encore la gloire,\n, Soit ton nom conservé par de savants grimoires!\n ] 1 ) Que faut-il écrire pour arriver à l affichage suivant? Que j aime à faire apprendre un nombre utile aux sages! Glorieux Archimède, artiste, ingénieur, Toi de qui Syracuse aime encore la gloire Soit ton nom conservé par de savants grimoires! Remarque : 4
2 ) Ajouter le vers Jadis, mystérieux, un problème bloquait dans notre poème. Le fichier poeme.txt est désormais : et, pour stocker toutes les lignes de notre fichier, on effectue à nouveau : f = open( poeme.txt, r ) 3 ) Stocker dans la variable ligne la deuxième ligne du poème, à savoir Glorieux Archimède, artiste, ingénieur,\n Rappeler la commande qui permet d obtenir la liste de chaînes de caractères suivante : [ Glorieux, Archimède,, artiste,, ingénieur, ] 4 ) On souhaite, à partir du poème, créer une liste dont les éléments sont les nombres de lettres de chaque mot. Si un mot a 10 lettres alors, on remplacera 10 par 0. On prendra garde à ne pas compter les éléments de ponctuation présents (s ils le sont, ils sont en fin de mot). 5
Remarque : Cela donne, après exécution : [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6, 4, 3, 3, 8, 3, 2, 7, 9, 5, 0, 2, 8, 8] Qu en pensez-vous? 4 A retenir Ouverture d un fichier : f = open( mon_fichier.txt, option) avec options : r (lecture), w (écriture), a (ajout) Fermeture d un fichier : permet de stocker toutes les lignes du fichier dans une liste (sous forme de chaînes de caractères). Si la variable ligne contient un certain les_lignes[i] alors ligne.split() permet de «casser» la ligne. ligne.strip() permet de supprimer les espaces, les sauts de ligne ou tabulations ( \n et \t ) en début et en fin de ligne. 6