Nous allons parler sur cette page de la manipulation de fichiers en Python, notion au programme de 1ère NSI.
Création d’un fichier
Nous allons créer un fichier nommé lipsum.txt dans lequel nous allons mettre une chaîne de caractères.
Ce n’est pas très long:
lipsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices. Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in, pretium quis, viverra ac, nunc. Praesent eget sem vel leo ultrices bibendum. Aenean faucibus. Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla. Cur- abitur auctor semper nulla. Donec varius orci eget risus. Duis nibh mi, congue eu, accumsan eleifend, sagittis quis, diam. Duis eget orci sit amet orci dignissim rutrum. Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. Morbi auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ultricies et, tellus. Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna, vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit mollis. Suspendisse ut massa. Cras nec ante. Pellentesque a nulla. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam tincidunt urna. Nulla ullamcorper vestibulum turpis. Pellentesque cursus luctus mauris. Nulla malesuada porttitor diam. Donec felis erat, congue non, volutpat at, tincidunt tristique, libero. Vivamus viverra fermentum felis. Donec nonummy pellentesque ante. Phasellus adipiscing semper elit. Proin fermentum massa ac quam. Sed diam turpis, molestie vitae, placerat a, molestie nec, leo. Mae- cenas lacinia. Nam ipsum ligula, eleifend at, accumsan nec, suscipit a, ipsum. Morbi blandit ligula feugiat magna. Nunc eleifend consequat lorem. Sed lacinia nulla vitae enim. Pellentesque tincidunt purus vel magna. Integer non enim. Praesent euismod nunc eu purus. Donec bibendum quam in tellus. Nullam cur- sus pulvinar lectus. Donec et mi. Nam vulputate metus eu enim. Vestibulum pellentesque felis eu massa. Quisque ullamcorper placerat ipsum. Cras nibh. Morbi vel justo vitae lacus tincidunt ultrices. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In hac habitasse platea dictumst. Integer tempus convallis augue. Etiam facilisis. Nunc elementum fermentum wisi. Aenean placerat. Ut imperdiet, enim sed gravida sollicitudin, felis odio placerat quam, ac pulvinar elit purus eget enim. Nunc vitae tortor. Proin tempus nibh sit amet nisl. Vivamus quis tortor vitae risus porta vehicula. Fusce mauris. Vestibulum luctus nibh at lectus. Sed bibendum, nulla a fau- cibus semper, leo velit ultricies tellus, ac venenatis arcu wisi vel nisl. Vestibulum diam. Aliquam pellentesque, augue quis sagittis posuere, turpis lacus congue quam, in hendrerit risus eros eget felis. Maecenas eget erat in sapien mattis porttitor. Vestibulum porttitor. Nulla facilisi. Sed a turpis eu lacus commodo facilisis. Morbi fringilla, wisi in dignissim interdum, justo lectus sagittis dui, et vehicula libero dui cursus dui. Mauris tempor ligula sed lacus. Duis cursus enim ut augue. Cras ac magna. Cras nulla. Nulla egestas. Curabitur a leo. Quisque egestas wisi eget nunc. Nam feugiat lacus vel est. Curabitur consectetuer. Suspendisse vel felis. Ut lorem lorem, interdum eu, tincidunt sit amet, laoreet vitae, arcu. Aenean faucibus pede eu ante. Praesent enim elit, rutrum at, molestie non, nonummy vel, nisl. Ut lectus eros, malesuada sit amet, fer- mentum eu, sodales cursus, magna. Donec eu purus. Quisque vehicula, urna sed ultricies auctor, pede lorem egestas dui, et convallis elit erat sed nulla. Donec luctus. Curabitur et nunc. Aliquam dolor odio, commodo pretium, ultricies non, pharetra in, velit. Integer arcu est, nonummy in, fermentum faucibus, egestas vel, odio. Sed commodo posuere pede. Mauris ut est. Ut quis purus. Sed ac odio. Sed vehicula hendrerit sem. Duis non odio. Morbi ut dui. Sed accumsan risus eget odio. In hac habitasse platea dictumst. Pellentesque non elit. Fusce sed justo eu urna porta tincidunt. Mauris felis odio, sollicitudin sed, volutpat a, ornare ac, erat. Morbi quis dolor. Donec pellentesque, erat ac sagittis semper, nunc dui lobortis purus, quis congue purus metus ultricies tellus. Proin et quam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Praesent sapien turpis, fermentum vel, eleifend faucibus, vehicula eu, lacus.' NomFichier = 'lipsum.txt' Fichier = open(NomFichier, 'w' , encoding='utf8') Fichier.write( lipsum ) Fichier.close()
Ceci nous servira de base pour les exercices suivants.
Qu’avons-nous fait ici ? Et bien, nous avons créer un objet avec la fonction open() (cette notion d’objet est au programme de Terminale). À cet objet sont rattachées plusieurs méthodes.
Pour avoir la liste des méthodes que l’on peut utiliser sur ce type d’objet, on tape dans la console Python :
>>> dir(Fichier)
et on voit alors s’afficher toutes les méthodes :
['_CHUNK_SIZE', 'class', 'del', 'delattr', 'dict', 'dir', 'doc', 'enter', 'eq', 'exit', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'iter', 'le', 'lt', 'ne', 'new', 'next', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']
Dans notre programme, nous avons utilisé la méthode write, qui permet d’écrire dans un fichier.
Notez que j’ai précisé l’encodage quand j’ai créé l’objet (encoding=’utf8′) et que j’ai passé en deuxième paramètre la lettre ‘w’ (pour writable). Nous avons le choix entre les paramètres suivants:
- ‘r’ : pour créer un fichier en mode lecture (reading mode);
- ‘w’ : pour créer un fichier en mode écriture (writing mode);
- ‘a’ : pour créer un fichier en mode ajout (appending mode);
- ‘r+’ : pour créer un fichier en mode “reading and writing mode”;
- w+ : pour créer un fichier en mode “writing and reading mode”;
- ‘rb’ : pour lire en mode binaire (binary mode);
- ‘wb’ : pour écrire en mode binaire.
Lecture d’un fichier
Pour lire le contenu brut d’un fichier, on fera:
Fichier = open('lipsum.txt' , 'r', encoding = 'utf8') contenu = Fichier.read() print( contenu )
Manipulation du contenu
Comme vous pourrez le constater, il n’y a qu’une seule ligne dans ce fichier, et ce n’est pas pratique. J’aimerais donc ajouter un retour tous les 20 mots. Je vais donc écrire quelque chose qui ressemble à cela:
Fichier = open('lipsum.txt' , 'r' , encoding = 'utf8') contenu = Fichier.read() lignes = [] liste_mots = contenu.split(' ') for n in range( len(liste_mots) ): if n == 0: item_lignes = '' elif n % 21 == 0: lignes.append( item_lignes ) item_lignes = '' else: item_lignes += ' ' + liste_mots[n] for i in lignes: print( i )
Modification d’un fichier
Maintenant, j’aimerais remplacer le contenu du fichier par toutes les lignes que je viens d’obtenir.
Fichier = open('lipsum.txt' , 'r', encoding = 'utf8') contenu = Fichier.read() Fichier.close() lignes = [] liste_mots = contenu.split(' ') for n in range( len(liste_mots) ): if n == 0: item_lignes = '' elif n % 21 == 0: lignes.append( item_lignes ) item_lignes = '' else: item_lignes += ' ' + liste_mots[n] contenu = '' for i in lignes: contenu += i + '\n' contenu = contenu[:-1] Fichier = open('lipsum.txt', 'w' , encoding = 'utf8') Fichier.write( contenu ) Fichier.close()
Dans ce dernier script, j’ouvre le fichier texte en mode lecture puis je le ferme. Ensuite, je fais mes manipulations et ensuite, à partir de la ligne 17, je redéfinis le contenu en créant une chaîne de caractères et en ajoutant un “\n” (retour à la ligne) à la fin de chaque ligne. J’enlève ensuite le dernier “\n” qui ne sert à rien (avec “contenu[-1]”).
Bien entendu, on peut faire plus simple. En effet, le passage par une liste des lignes n’est pas nécessaire car on peut directement incruster un “\n” tous les 20 mots:
import re # --- lecture Fichier = open('lipsum.txt' , 'r+', encoding = 'utf8') contenu = Fichier.read() Fichier.close() #--- Liste contenant la position de toutes les espaces dans le chaîne de caractères "contenu" L = [ m.start() for m in re.finditer(' ', contenu)] #--- On parcourt la liste L en commençant par la 20ième espace (en position 19 à partir de 0), par pas de 20 for p in range(19, len(L) , 20): position = L[p] contenu = contenu[:position] + '\n' + contenu[position+1:] #--- On réécrit le fichier texte avec le nouveau contenu Fichier = open('lipsum.txt', 'w' , encoding = 'utf8') Fichier.write( contenu ) Fichier.close()
Note : je n’ai pas ouvert le fichier texte en mode ‘r+’ car je voulais remplacer le contenu, et non ajouter du contenu après ce qui était déjà dans le fichier. C’est pour cela que j’ai d’abord lu le fichier, puis clos pour ensuite l’ouvrir en mode écriture afin de l’écraser.
Lire un fichier ligne par ligne
Maintenant que mon fichier contient plusieurs lignes, je vais pouvoir l’ouvrir et lire chacune d’elles.
Fichier = open('lipsum.txt' , 'r', encoding = 'utf8') i = 1 for ligne in Fichier: print( 'L{} : {}'.format(i,ligne.replace('\n','')) ) i += 1
J’ai ajouté quelques fioritures afin que l’affichage soit plus sympathique :
- d’abord, j’ai ajouté un compteur (i) pour mettre le numéro des lignes avant chacune d’elles;
- ensuite, j’ai formaté l’affichage avec la méthode format;
- enfin, j’ai supprimé les sauts de lignes qu’il y avait à la fin des lignes avec la méthode replace car la fonction print insère automatiquement des sauts de lignes.
J’obtiens alors:
L1 : Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum L2 : gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant morbi L3 : tristique senectus et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra metus rhoncus sem. Nulla et L4 : lectus vestibulum urna fringilla ultrices. Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in, pretium quis, L5 : viverra ac, nunc. Praesent eget sem vel leo ultrices bibendum. Aenean faucibus. Morbi dolor nulla, malesuada eu, pulvinar at, mollis L6 : ac, nulla. Cur- abitur auctor semper nulla. Donec varius orci eget risus. Duis nibh mi, congue eu, accumsan eleifend, sagittis L7 : quis, diam. Duis eget orci sit amet orci dignissim rutrum. Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi. L8 : Morbi auctor lorem non justo. Nam lacus libero, pretium at, lobortis vitae, ultricies et, tellus. Donec aliquet, tortor sed accumsan L9 : bibendum, erat ligula aliquet magna, vitae ornare odio metus a mi. Morbi ac orci et nisl hendrerit mollis. Suspendisse ut L10 : massa. Cras nec ante. Pellentesque a nulla. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam L11 : tincidunt urna. Nulla ullamcorper vestibulum turpis. Pellentesque cursus luctus mauris. Nulla malesuada porttitor diam. Donec felis erat, congue non, volutpat L12 : at, tincidunt tristique, libero. Vivamus viverra fermentum felis. Donec nonummy pellentesque ante. Phasellus adipiscing semper elit. Proin fermentum massa ac L13 : quam. Sed diam turpis, molestie vitae, placerat a, molestie nec, leo. Mae- cenas lacinia. Nam ipsum ligula, eleifend at, accumsan L14 : nec, suscipit a, ipsum. Morbi blandit ligula feugiat magna. Nunc eleifend consequat lorem. Sed lacinia nulla vitae enim. Pellentesque tincidunt L15 : purus vel magna. Integer non enim. Praesent euismod nunc eu purus. Donec bibendum quam in tellus. Nullam cur- sus pulvinar L16 : lectus. Donec et mi. Nam vulputate metus eu enim. Vestibulum pellentesque felis eu massa. Quisque ullamcorper placerat ipsum. Cras nibh. L17 : Morbi vel justo vitae lacus tincidunt ultrices. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In hac habitasse platea dictumst. L18 : Integer tempus convallis augue. Etiam facilisis. Nunc elementum fermentum wisi. Aenean placerat. Ut imperdiet, enim sed gravida sollicitudin, felis odio L19 : placerat quam, ac pulvinar elit purus eget enim. Nunc vitae tortor. Proin tempus nibh sit amet nisl. Vivamus quis tortor L20 : vitae risus porta vehicula. Fusce mauris. Vestibulum luctus nibh at lectus. Sed bibendum, nulla a fau- cibus semper, leo velit L21 : ultricies tellus, ac venenatis arcu wisi vel nisl. Vestibulum diam. Aliquam pellentesque, augue quis sagittis posuere, turpis lacus congue quam, L22 : in hendrerit risus eros eget felis. Maecenas eget erat in sapien mattis porttitor. Vestibulum porttitor. Nulla facilisi. Sed a turpis L23 : eu lacus commodo facilisis. Morbi fringilla, wisi in dignissim interdum, justo lectus sagittis dui, et vehicula libero dui cursus dui. L24 : Mauris tempor ligula sed lacus. Duis cursus enim ut augue. Cras ac magna. Cras nulla. Nulla egestas. Curabitur a leo. L25 : Quisque egestas wisi eget nunc. Nam feugiat lacus vel est. Curabitur consectetuer. Suspendisse vel felis. Ut lorem lorem, interdum eu, L26 : tincidunt sit amet, laoreet vitae, arcu. Aenean faucibus pede eu ante. Praesent enim elit, rutrum at, molestie non, nonummy vel, L27 : nisl. Ut lectus eros, malesuada sit amet, fer- mentum eu, sodales cursus, magna. Donec eu purus. Quisque vehicula, urna sed L28 : ultricies auctor, pede lorem egestas dui, et convallis elit erat sed nulla. Donec luctus. Curabitur et nunc. Aliquam dolor odio, L29 : commodo pretium, ultricies non, pharetra in, velit. Integer arcu est, nonummy in, fermentum faucibus, egestas vel, odio. Sed commodo posuere L30 : pede. Mauris ut est. Ut quis purus. Sed ac odio. Sed vehicula hendrerit sem. Duis non odio. Morbi ut dui. L31 : Sed accumsan risus eget odio. In hac habitasse platea dictumst. Pellentesque non elit. Fusce sed justo eu urna porta tincidunt. L32 : Mauris felis odio, sollicitudin sed, volutpat a, ornare ac, erat. Morbi quis dolor. Donec pellentesque, erat ac sagittis semper, nunc L33 : dui lobortis purus, quis congue purus metus ultricies tellus. Proin et quam. Class aptent taciti sociosqu ad litora torquent per L34 : conubia nostra, per inceptos hymenaeos. Praesent sapien turpis, fermentum vel, eleifend faucibus, vehicula eu, lacus.
Afficher une ligne spécifique
J’ai envie d’afficher la deuxième et la dernière ligne:
Fichier = open('lipsum.txt', 'r', encoding = 'utf8') deuxieme_ligne = Fichier.readlines()[1] Fichier = open('lipsum.txt', 'r') derniere_ligne = Fichier.readlines()[-1] print(deuxieme_ligne + derniere_ligne) Fichier.close()
Notez ici que j’ai dû construire deux fois l’objet Fichier. La méthode readlines() construit une liste de toutes les lignes. Ainsi, pour éviter de construire deux fois cette liste, le plus intelligent est de faire:
Fichier = open('lipsum.txt', 'r', encoding = 'utf8') lignes = Fichier.readlines() deuxieme_ligne = lignes[1] derniere_ligne = lignes[-1] print(deuxieme_ligne + derniere_ligne) Fichier.close()
Syntaxe plus courante
Lorsque l’on travaille avec un objet fichier, il est d’usage d’utiliser la syntaxe suivante:
with open('lipsum.txt', 'a' , encoding = 'utf8') as Fichier: new_line = '\nC\'est la dernière ligne.' Fichier.write(new_line)
Voilà ! La manipulation de fichiers en Python n’a plus de secret pour vous maintenant !
[Retour aux ressources Python]