Les Fichiers
Dans de très nombreuses situations, un programme doit pouvoir récupérer ou écrire des informations dans un fichier. Ce chapitre propose de découvrir les fonctions de Python permettant de le faire. Nous utiliserons trois exemples de fichiers disponibles en téléchargement ci-dessous :
- le fichier informaticiens.txt qui contient une liste d'informaticiens célèbres
- le fichier films.txt qui contient une liste de films.
- le fichier dates.txt qui contient une liste de dates au format
JJ/MM/AAAA
.
Danger
Avant de continuer télécharger ces fichiers (clic droit sur leurs noms puis Enregistrer la cible du lien sous ...
) dans un dossier de votre choix, par la suite vous sauvegarderez vos scripts Python de ce chapitre dans ce même répertoire.
Ouverture d'un fichier en lecture seule⚓︎
Pour ouvrir un fichier, on utilise la fonction open
, cette fonction prend comme paramètre le nom du fichier et elle renvoie une variable appelée descripteur de fichier. Par exemple, dans l'instruction suivante :
lecteur
est notre descripteur de fichier, et nous avons ouvert le fichier ayant pour nom sur le disque dur : informaticiens.txt
. Il faut interpréter un descripteur de fichier comme un canal de lecture pour accéder à ce fichier.
Si après avoir exécuté le programme ci-dessous vous obtenez un FileNotFoundError: [Errno 2] No such file or directory:
c'est que Python ne trouve pas sur votre disque dur le fichier que vous essayez d'ouvrir, on rappelle que le programme Python et le fichier doivent se trouver dans le même répertoire !
A retenir
- La fonction #!python
open
permet d'ouvrir un fichier présent dans le dossier courant. - Cette fonction prend en paramètre un nom de fichier et renvoie un descripteur de fichier.
- L'erreur
FileNotFoundError
indique que le fichier n'a pas été trouvé.
Lecture d'un fichier⚓︎
Si l'instruction lecteur = open("informaticiens.txt")
s'est produite correctement, on dispose maintenant d'un canal de lecture vers le fichier. Pour lire les données on utilise la fonction read
sur ce descripteur :
lecteur = open("informaticiens.txt")
# Une fois le fichier ouvert, on effectue les opérations de lecture sur le descripteur
contenu = lecteur.read()
print(contenu)
Comme vous pouvez le constater, la fonction read
lit la totalité du fichier en une seule fois !
D'autre part, une fois le fichier lu tout se passe comme si le descripteur de fichier lecteur
était arrivé à la fin du fichier, ainsi une deuxième lecture du fichier ne retournera plus aucune donnée (la fin de fichier est déjà atteinte).
lecteur = open("informaticiens.txt")
# Une fois le fichier ouvert, on effectue les opérations de lecture sur le descripteur
contenu = lecteur.read()
print(contenu)
deuxieme_lecture = lecteur.read()
print("Deuxieme lecture :", deuxieme_lecture)
La variable deuxieme_lecture
est vide le descripteur de fichier étant positionné "à la fin" il n'y a plus d'informations à lire.
A retenir
- La fonction
read
permet de lire la totalité d'un fichier ouvert avecopen
. - Après lecture, le descripteur de fichier est positionné en fin de fichier et il n'y a plus d'information à lire.
Une bonne pratique de programmation consiste à fermer un fichier après l'avoir utilisé. C'est le rôle de l'instruction close
, le programme précédent devrait donc se terminer par lecteur.close()
.
- En utilisant Python, ouvrir le fichier films.txt
- Lire ce fichier et en afficher le contenu
- Fermer ce fichier
Au lieu de lire la totalité d'un fichier en une seule fois, il peut être préférable d'en récupérer les lignes soit dans une liste, soit une à une :
-
afin de récupérer les lignes d'un fichier dans une liste, on peut utiliser
readlines
:PythonOn remarquera bien la différence aveclecteur = open("informaticiens.txt") lignes = lecteur.readlines() print(lignes) lecteur.close()
read
: ici on obtient une liste, ce qui permet par exemple d'accéder directement à une ligne en particulier du fichier :print(lignes[5])
. -
une autre possibilié est d'utiliser
readline
qui a pour effet de lire une seule ligne du fichier puis de positionner le descripteur de fichier sur la ligne suivante :Python# Ouverture du fichier lecteur = open("informaticiens.txt") # Lecture de la première ligne ligne1 = lecteur.readline() # le pointeur de lecture est positionné à la ligne suivante, un autre appel à readline lira donc la 2e ligne ligne2 = lecteur.readline() # Lecture terminée on ferme le fichier lecteur.close() print(ligne1) print(ligne2)
-
En utilisant
readlines
lire dans une liste les films présents dans le fichiersfilms.txt
. Quel film se trouve sur la ligne 4 (on numérote les lignes à partir de 0). - Même question en utilisant
readline
Ecriture dans un fichier⚓︎
Pour Ă©crire dans un fichier, il faut l'ouvrir en mode 'w'
(pour write), si le fichier n'existe pas sur votre disque dur, il sera automatiquement crée :
fichier_prenoms = open("prenoms.txt","w")
fichier_prenoms.write("Alice")
fichier_prenoms.write("John")
fichier_prenoms.write("Billy")
fichier_prenoms.close()
prenoms.txt
est crée dans votre répertoire.
- Ouvrir le fichier prenoms.txt, le lire et en afficher le contenu Ă l'aide de Python. Que remarquez-vous ?
- Comment ajouter les sauts de lignes ?
Traitement sur les lignes⚓︎
Souvent, chaque donnée d'un fichier se trouve sur une ligne, par exemple le fichier dates.txt (que vous du déjà téléchargé dans votre répertoire travail) contient une date par ligne. En lisant ce fichier avec readlines
, on récupère donc une listes de dates mais le saut de ligne final est présent :
reader = open("dates.txt")
contenu = reader.readlines()
print(contenu)
## affiche ['15/01/2012\n', '9/09/2007\n', '24/08/1999\n', '11/04/2000\n']
strip
qui s'applique sur une chaines de caractères et renvoie une copie de cette chaine sans les sauts de lignes ou espace de début et de fin, ce qui donne :
reader = open("dates.txt")
contenu = reader.readlines()
dates = [ligne.strip() for ligne in contenu]
print(dates)
## affiche ['15/01/2012', '9/09/2007', '24/08/1999', '11/04/2000']
split
qui s'applique sur une chaine de caractères et prend en argument un séparateur. Cette fonction renvoie les sous chaines construites en découpant la chaine de départ suivant le caractère séparateur. Par exemple :
mots = "Python est super".split(" ")
# mots contient ["Python", "est", "super"]
prenoms = "Amélie,Pierre,Jacques,Albert,Susie".split(",")
# prenoms contient ["Amélie","Pierre","Jacques","Albert","Susie"]
valeurs = "5-12-54-11-13-9".split("-")
# valeurs contient ["5", "12", "54", "11", "13", "9"]
reader = open("dates.txt")
contenu = reader.readlines()
dates = [ligne.strip().split("/") for ligne in contenu]
print(dates)
# affiche [['15', '01', '2012'], ['9', '09', '2007'], ['24', '08', '1999'], ['11', '04', '2000']]
Exercices de synthèse⚓︎
-
Entiers
-
Le fichier entiers.txt contient sur chaque ligne un entier.
-
Ecrire une fonction qui prend en paramètre un nom de fichier et retourne le nombre de lignes de ce fichier.
Aide
Les données lues dans un fichier sont toujours des chaines de caractères (type
str
), si on les additionne avec+
cela correspond donc à la concaténation des chaines de caractères (comme dans"20" + "24"
qui donne"2024"
). Pour traiter les valeurs lues dans le fichier comme des entiers, il faudra donc au préalable les convertir en entier ! -
-
Dictionnaire Pour cet exercice on utilise le dictionnaire.txt: !!! note pour éviter le problème avec les caractères non ASCII (accents...) on précise un paramètre supplémentaire : l'encodage.
Text OnlyLa fonction qui ouvre le fichier devient :`open('dictionnaire.txt', 'r', encoding='utf-8')`
- Combien il y a-t-il de mots dans ce dictionnaire ?
- Lister tous les mots de 17 lettres de ce dictionnaire.
- Quel est le plus grand mot de ce dictionnaire ?
- Lister tous les mots de 5 lettres qui ont un d en deuxième position et se terminent par un e.
- Lister tous les mots palindromes de ce dictionnaire (un mot palindrome est un mot pouvant se lire indifféremment dans les deux sens par exemple kayak ou été)
-
Les boîtes Le fichier boites.txt est téléchargeable ci-dessous, chaque ligne de ce fichier contient la référence d'un modèle de boîte sous la forme d'un code à 4 lettres suivi de trois entiers représentant les dimensions de la boîte. A titre d'exemple, les trois premières lignes du fichier sont :
Donc, la boite de référenceNWLR
a comme dimension283x75x46
. -
Trouver la référence de la boite ayant le plus grand volume et indiquer la valeur du volume.