C3 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()
.
Exercice 1 : A vous de jouer !¶
- 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
On remarquera bien la différence avecreadlines
: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 :# 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)
Exercice 2 : Affichage d'une ligne¶
- 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.
Exercice 3 : Ajouter les sauts de lignes¶
- 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¶
Exercice 4 : Manipulation de fichiers en Python¶
-
Recopier et compléter le tableau suivant :
Nom du fichier Descripteur Mode Ouverture Fermeture eleves.txt
fic
lecture d = open("dates.txt","a")
couleurs.txt
écriture fic.close()
data.txt
data
ajout exos = open("exos.txt","r")
-
Quel instruction Python permet d'écrire dans un fichier un passage à la ligne ?
- Que se passe-t-il si on ouvre un fichier déjà existant en mode écriture ?
- Quelle instruction doit-on toujours trouver après une instruction
open
?
Exercice 5 : Nombre de lignes d'un fichier¶
Ecrire une fonction qui prend en paramètre un nom de fichier et retourne le nombre de lignes de ce fichier.
Exercice 6 : Recherche dans un dictionnaire¶
Pour cette exercice on utilise le dictionnaire téléchargeable ci-dessous: Dictionnaire
- 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é)
Exercice 7 : Somme des entiers dans un fichier¶
Le fichier entiers.txt
téléchargeable ci-dessous contient sur chaque ligne un entier. Ecrire un programme Python qui lit ce fichier et fait la somme de ces entiers.
entiers.txt
Vérifier la réponse fournie par votre programme ci-dessous :
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 !
Exercice 8 : Boîte de plus grand volume¶
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 :
NWLR
a comme dimension 283x75x46
.
boites.txt
Trouver la référence de la boîte de plus grand volume, et vérifier votre résultat dans le formulaire suivant :