Manipulation de fichiers en Python

Nous allons parler sur cette page de la manipulation de fichiers en Python, notion au programme de 1ère NSI.

Manipulation de fichiers en Python

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 meut 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 remplacé 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]

Supportscreen tag