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 :
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_fichieraffecte à la variablemon_fichierle contenu (de typestring) du fichierfichier.txt.- Si le fichier
fichier.txtn’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 texteUn peu de texte à écrire dans le fichier.dans le fichierfichier.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'erreurFileNotFoundError: [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 :
rbouwbouab: Ouvre le fichier en mode binaire (lecture des octets au lieu des caractères).r+ouw+oua+: Ouvre le fichier en lecture et en écriture.rb+ouwb+ouab+: 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 :
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 :
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 :
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 :
with open ("fichier.txt", 'r') as mon_fichier:
for ligne in mon_fichier:
print(ligne.strip())
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_fichieraffecte àmon_fichierle fichierfichier.txten mode lecture (read).for ligne in mon_fichierparcourt le fichierfichier.txt, ligne par ligne..strip()permet de supprimer les lignes vides
with open ("fichier.txt", 'r') as mon_fichier:
une_ligne = mon_fichier.readline()
print(une_ligne)
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
nbde caractères d’une ligne avec.readline(nb).
with open ("fichier.txt", 'r') as mon_fichier:
texte = mon_fichier.read()
print(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 fichierfichier.txt.
with open ("fichier.txt", 'r') as mon_fichier:
lignes = mon_fichier.readlines()
print(lignes)
['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 fichierfichier.txtdans 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.
salutation = "Bonjour à tous"
liste_de_mots = salutation.split()
print(liste_de_mots)
['Bonjour', 'à', 'tous']
donnees = "Nom, Prénom, Âge"
liste_de_mots = donnees.split(", ")
print(liste_de_mots)
['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 variablesaetbavecmon_fichier.write(a, b).
Il est nécessaire : soit d'écriremon_fichier.write(a), puismon_fichier.write(b); soit de concatener les chaînes à écrire pour n'en faire qu'unemon_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 nombrex = 10, on le convertit :mon_fichier.write(str(x)).