Aller au contenu

Cours Gestion Fichiers

Introduction⚓︎

Il est souvent nécessaire, dans un projet, de chercher ou d’enregistrer des informations dans un fichier externe au programme (résultats de mesures, fichier de noms, de scores, etc.). Voici les principaux outils pour effectuer ces opérations avec Python.

Ouverture et écriture⚓︎

On considère le programme suivant :

🐍 Script Python
with open("fichier.txt", 'w') as mon_fichier:
    mon_fichier.write("Un peu de texte à écrire dans le fichier.")
  • with open("fichier.txt", 'w') as mon_fichier affecte à la variable mon_fichier le contenu (de type string) du fichier fichier.txt.
  • Si le fichier fichier.txt n’existe pas, il est créé dans le dossier où le programme que l’on exécute est enregistré (répertoire courant).
  • Le 'w' signifie que le fichier est ouvert en mode écriture (write) ou réécriture (voir plus bas les différentes option d'ouverture).
  • mon_fichier.write("Un peu de texte à écrire dans le fichier.") écrit le texte Un peu de texte à écrire dans le fichier. dans le fichier fichier.txt.

Options d'ouverture⚓︎

Dans la fonction open("nom_du_fichier.txt", 'w') l'option d'ouverture 'w' peut être remplacée par :

  • r : (mode "read) Ouvre un fichier en lecture uniquement. Le pointeur est placé au début du fichier. C'est la valeur par défaut. Si le fichier n'existe pas, cela produit un message d'erreur FileNotFoundError: [Errno 2] No such file or directory: 'nom_du_fichier.txt').
  • w : (mode "write) Ouvre un fichier en écriture uniquement. Écrase le contenu du fichier s'il existe déjà, crée un nouveau fichier sinon. Le pointeur est placé au début du fichier.
  • a : (mode "append") Ouvre un fichier en écriture uniquement. Le pointeur est placé à la fin du fichier s'il existe, sinon un nouveau fichier est créé.

Il existe encore d'autres options moins couramment utilisées :

  • rb ou wb ou ab : Ouvre le fichier en mode binaire (lecture des octets au lieu des caractères).
  • r+ ou w+ ou a+ : Ouvre le fichier en lecture et en écriture.
  • rb+ ou wb+ ou ab+ : Combinaison des deux précédents.

Autre syntaxe⚓︎

La syntaxe open ... as ... permet de fermer automatiquement le fichier, ce qui est très important.
Mais il est aussi possible d'ouvrir et de fermer le fichier soi-même, explicitement. On écrira alors :

🐍 Script Python
mon_fichier = open("fichier.txt", 'w')
mon_fichier.write("Un peu de texte à écrire dans le fichier.")
mon_fichier.close()

Mais cette écriture est plus risquée. En effet, si, pour une raison ou une autre, le programme s'interrompt avant le close(), avec un bug qui n'a peut-être rien à voir avec le fichier (disons une erreur de typage lors d'une saisie d'une variable par un utilisateur, par exemple), le fichier ne sera pas fermé. Cela risque de le rendre inaccessible par la suite.

Préférez donc la syntaxe avec with, mais sachez que les deux existent.

Remarque⚓︎

On peut spécifier un encodage particulier :

🐍 Script Python
with open("fichier.txt", 'w', encoding="utf-8") as mon_fichier:
    mon_fichier.write("Un peu de texte à écrire dans le fichier.")

Lecture⚓︎

Il existe plusieurs méthodes pour lire le contenu d'un fichier :

  • texte = mon_fichier.read() lit l'intégralité du fichier.
  • lignes = mon_fichier.readlines() stocke toutes les lignes du fichier dans une liste.
  • for ligne in mon_fichier: parcourt le fichier, ligne par ligne.
  • L = mon_fichier.readline() lit une ligne du fichier et l'affecte à L.
  • while ligne:, associé à ligne = mon_fichier.readline(), permet de parcourir le fichier ligne par ligne TANT QUE la ligne n'est pas vide.

Exemple :⚓︎

On considère le fichier fichier.txt contenant le texte suivant :

📋 Texte
Cras placerat accumsan nulla.
Mauris mollis tincidunt felis.
Curabitur vulputate vestibulum lorem.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Fusce suscipit, wisi nec facilisis facilisis, est dui fermentum leo, quis tempor ligula erat quis odio.
Nunc aliquet, augue nec adipiscing interdum, lacus tellus malesuada massa, quis varius mi purus non odio.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Nunc eleifend leo vitae magna. Nullam tempus.

Soit le programme suivant :

🐍 Script Python
with open ("fichier.txt", 'r') as mon_fichier:
    for ligne in mon_fichier:
      print(ligne.strip())
📋 Texte
Cras placerat accumsan nulla.
Mauris mollis tincidunt felis.
Curabitur vulputate vestibulum lorem.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Fusce suscipit, wisi nec facilisis facilisis, est dui fermentum leo, quis tempor ligula erat quis odio.
Nunc aliquet, augue nec adipiscing interdum, lacus tellus malesuada massa, quis varius mi purus non odio.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Nunc eleifend leo vitae magna. Nullam tempus.
  • with open("fichier.txt",'r') as mon_fichier affecte à mon_fichier le fichier fichier.txt en mode lecture (read).
  • for ligne in mon_fichier parcourt le fichier fichier.txt, ligne par ligne.
  • .strip() permet de supprimer les lignes vides
🐍 Script Python
with open ("fichier.txt", 'r') as mon_fichier:
    une_ligne = mon_fichier.readline()
    print(une_ligne)
📋 Texte
Cras placerat accumsan nulla.
  • L = mon_fichier.readline() lit une ligne du fichier et l’affecte à L.
  • Pour afficher les deux première lignes du fichier, il faut appeler deux fois la méthode .readline().
  • On peut se contenter d’afficher un certains nombre nb de caractères d’une ligne avec .readline(nb).
🐍 Script Python
with open ("fichier.txt", 'r') as mon_fichier:
    texte = mon_fichier.read()
    print(texte)
📋 Texte
Cras placerat accumsan nulla.
Mauris mollis tincidunt felis. Curabitur vulputate vestibulum lorem.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce suscipit, wisi nec facilisis facilisis, est dui fermentum leo, quis tempor ligula erat quis odio. Nunc aliquet, augue nec adipiscing interdum, lacus tellus malesuada massa, quis varius mi purus non odio.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Nunc eleifend leo vitae magna. Nullam tempus.
  • texte = mon_fichier.read() lit l’intégralité du fichier fichier.txt.
🐍 Script Python
with open ("fichier.txt", 'r') as mon_fichier:
    lignes = mon_fichier.readlines()
    print(lignes)
📋 Texte
['Cras placerat accumsan nulla.\n', 'Mauris mollis tincidunt felis. Curabitur vulputate vestibulum lorem.\n', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce suscipit, wisi nec facilisis facilisis, est dui fermentum leo, quis tempor ligula erat quis odio. Nunc aliquet, augue nec adipiscing interdum, lacus tellus malesuada massa, quis varius mi purus non odio.\n', 'Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.\n', 'Nunc eleifend leo vitae magna. Nullam tempus.\n']
  • lignes = mon_fichier.readlines() stocke toutes les lignes du fichier fichier.txt dans une liste.

Méthodes sur les chaînes de caractères :⚓︎

Attention, les passages à la ligne sont lus comme des caractères.

On peut alors utiliser des méthodes des chaînes de caractères pour manipuler le contenu du fichier qu'on a récupéré :

  • .strip() permet de supprimer les espaces superflus en début et en fin de chaîne.
  • La méthode .split() permet de transformer une chaîne de caractères en une liste des "mots" qui composent cette chaîne.
    Par défaut, cette méthode utilise les espaces pour séparer les "mots", .split() est équivalent à .split(' '). On peut spécifier un autre séparateur dans les parenthèses.
    Par exemple, .split('\n') coupe le texte à chaque retour à la ligne, sépare les lignes les unes des autres sous forme d'une liste.
🐍 Script Python
salutation = "Bonjour à tous"
liste_de_mots = salutation.split()
print(liste_de_mots)
📋 Texte
['Bonjour', 'à', 'tous']
🐍 Script Python
donnees = "Nom, Prénom, Âge"
liste_de_mots = donnees.split(", ")
print(liste_de_mots)
📋 Texte
['Nom', 'Prénom', 'Âge']

Ecriture⚓︎

Une fois un fichier ouvert en écriture avec with open("fichier.txt", 'w') as mon_fichier:, on écrit dans le fichier avec la méthode mon_fichier.write()

Mais, attention, cette méthode n'a pas le même comportement que la fonction print.

  • .write() ne passe pas automatiquement à la ligne. Si on veut passer à la ligne dans le fichier, il faudra l'indiquer explicitement : .write('\n')
  • .write() accepte uniquement 1 argument. On ne peut pas écrire le contenu de 2 variables a et b avec mon_fichier.write(a, b).
    Il est nécessaire : soit d'écrire mon_fichier.write(a), puis mon_fichier.write(b) ; soit de concatener les chaînes à écrire pour n'en faire qu'une mon_fichier.write(a+b).
  • .write() n'accepte que des arguments de type chaîne de caractères. Il est alors nécessaire de convertir tout autre type avant d'utiliser .write().
    Par exemple, pour écrire un nombre x = 10, on le convertit : mon_fichier.write(str(x)).