13 - Fichiers
Cours associé : 13 - Fichiers .
Exercice 0 : QCM – vérification des prérequis
Pour chaque question, une seule réponse est correcte.
1. Quel mode d’ouverture permet d’écrire dans un fichier en effaçant son contenu précédent ?
- A.
open("f.txt", "r") - B.
open("f.txt", "w") - C.
open("f.txt", "a") - D.
open("f.txt", "x")
Correction publiée après la séance.
2. Que fait l’instruction with open("f.txt", "r") as f: ?
- A. Elle crée un nouveau fichier
f.txt - B. Elle ouvre
f.txten lecture et le ferme automatiquement à la fin du bloc - C. Elle ouvre
f.txten écriture - D. Elle supprime le fichier
f.txt
Correction publiée après la séance.
3. Après ligne = f.readline(), que contient ligne ?
- A. Toutes les lignes du fichier sous forme de liste
- B. Une seule ligne du fichier, avec le caractère
\nà la fin - C. Une seule ligne du fichier, sans le caractère
\n - D. Le fichier entier sous forme de chaîne
Correction publiée après la séance.
4. Que se passe-t-il si on exécute f.write("Bonjour") puis f.write("monde") sans rien entre les deux ?
- A. Le fichier contient
Bonjour\nmonde - B. Le fichier contient
Bonjourmonde - C. Le fichier contient
Bonjour monde - D. Python lève une erreur
Correction publiée après la séance.
Exercice 1 : écriture simple
Écrire un programme qui crée un fichier
fruits.txtcontenant les noms de cinq fruits, un par ligne.Indice
Ouvrir le fichier en écriture avec
with open("fruits.txt", "w") as f:, puis écrire chaque fruit avecf.write(...), sans oublier\nà la fin du nom :writen’ajoute aucun retour à la ligne.Vérifier le contenu du fichier en l’ouvrant avec un éditeur de texte.
Modifier le programme pour ajouter trois fruits supplémentaires au fichier existant (sans effacer les cinq premiers).
Indice
Le mode
"a"écrit à la fin du fichier sans effacer son contenu ; le mode"w"effacerait les cinq premiers fruits.
Correction publiée après la séance.
Exercice 2 : lecture et affichage
On dispose du fichier fruits.txt créé à l’exercice précédent.
Écrire un programme qui lit le fichier et affiche chaque fruit précédé de son numéro :
1. Pomme 2. Banane 3. Cerise ...Indice
Parcourir le fichier avec
for ligne in f:et faire augmenter un compteur de 1 à chaque ligne. Afficher le compteur etligne.strip(): sansstrip(), le\nde chaque ligne ajouterait une ligne vide à l’affichage.Code à copier puis compléter
with open("fruits.txt", "r") as f: numero = 1 for ligne in f: print(f"{numero}. {...}") numero = ...Écrire un programme qui lit le fichier et affiche le nombre total de fruits.
Indice
Compter les lignes : avec un compteur qui augmente de 1 à chaque ligne, ou avec la longueur de la liste renvoyée par
f.readlines().
Correction publiée après la séance.
Exercice 3 : le caractère \n
On crée le fichier suivant :
with open('test.txt', 'w') as f:
f.write('Bonjour')
f.write('le')
f.write('monde')
Sans exécuter le code, prédire le contenu du fichier
test.txt.Indice
Qu’ajoute
writeaprès la chaîne qu’elle écrit : un espace, un retour à la ligne, ou rien du tout ? La question 4 du QCM y répond.Vérifier en exécutant le programme.
Modifier le programme pour que chaque mot apparaisse sur une ligne distincte.
Indice
Le retour à la ligne est le caractère
\n: l’ajouter à la fin de chaque chaîne écrite.
Correction publiée après la séance.
Exercice 4 : traitement de données
On dispose d’un fichier mesures.txt contenant une température par ligne :
18.5
21.3
19.7
22.1
17.8
20.4
Écrire un programme qui :
lit toutes les températures ;
Indice
Partir d’une liste vide. Pour chaque ligne du fichier, retirer le
\navecstrip(), convertir le texte en nombre avecfloat(), puis ajouter ce nombre à la liste avecappend.Code à copier puis compléter
temperatures = [] with open("mesures.txt", "r") as f: for ligne in f: temperatures.append(...)affiche la température minimale, la température maximale et la moyenne (arrondie à un chiffre après la virgule).
Indice
Les fonctions
min,max,sumetlens’appliquent à la liste des températures : la moyenne est la somme divisée par le nombre de valeurs, etround(x, 1)arronditxà un chiffre après la virgule.
Correction publiée après la séance.
Exercice 5 : fichier structuré
On dispose d’un fichier eleves.txt dont chaque ligne contient un nom et une note séparés par un point-virgule :
Alice Martin;16
Bob Dupont;12
Charlie Moreau;8
Diana Petit;14
Eve Bernard;18
Écrire un programme qui :
affiche le nom et la note de chaque élève ;
Indice
Pour chaque ligne,
ligne.strip().split(";")donne une liste de deux chaînes : le nom, puis la note, à convertir avecint(). Ranger aussi chaque couple(nom, note)dans une liste : elle servira aux questions 2 et 3.Code à copier puis compléter
eleves = [] with open("eleves.txt", "r") as f: for ligne in f: parties = ligne.strip().split(...) nom = parties[0] note = int(...) eleves.append((nom, note)) print(f"{nom} : {note}/20")calcule et affiche la moyenne de la classe ;
Indice
Parcourir la liste des couples
(nom, note)de la question 1 en additionnant les notes, puis diviser la somme par le nombre d’élèves,len(eleves).affiche les noms des élèves ayant une note supérieure ou égale à la moyenne.
Indice
Parcourir de nouveau la liste des couples et n’afficher que les noms dont la note est supérieure ou égale à la moyenne de la question 2.
Correction publiée après la séance.
Exercice 6 : copie filtrée
Écrire un programme qui lit le fichier eleves.txt de l’exercice précédent et crée un fichier reussite.txt contenant uniquement les lignes des élèves ayant obtenu 10 ou plus.
Indice
Ouvrir deux fichiers avec deux with imbriqués : eleves.txt en lecture et reussite.txt en écriture. Pour chaque ligne lue, extraire la note comme à l’exercice 5 et, si elle vaut au moins 10, écrire la ligne telle quelle : elle contient déjà son \n.
Code à copier puis compléter
with open("eleves.txt", "r") as source:
with open("reussite.txt", "w") as dest:
for ligne in source:
parties = ligne.strip().split(";")
note = int(...)
if ...:
dest.write(...)
Correction publiée après la séance.
Exercice 7 : statistiques de texte
Écrire une fonction statistiques(nom_fichier) qui reçoit le nom d’un fichier texte et renvoie un dictionnaire contenant le nombre de lignes, le nombre de mots (en utilisant split()) et le nombre de caractères (espaces compris).
stats = statistiques('eleves.txt')
print(stats)
# {'lignes': 5, 'mots': 10, 'caracteres': 77}
Indice
Trois compteurs partent de 0 et augmentent à chaque ligne lue : de 1 pour les lignes, du nombre d’éléments de ligne.split() pour les mots, de la longueur de la ligne, \n compris, pour les caractères. Renvoyer ensuite un dictionnaire dont les clés sont "lignes", "mots" et "caracteres".
Code à copier puis compléter
def statistiques(nom_fichier):
nb_lignes = 0
nb_mots = 0
nb_caracteres = 0
with open(nom_fichier, "r") as f:
for ligne in f:
nb_lignes = nb_lignes + 1
nb_mots = nb_mots + ...
nb_caracteres = ...
return {"lignes": nb_lignes, "mots": ..., "caracteres": ...}
Correction publiée après la séance.
Exercice 8 : synthèse – statistiques sur les lettres d’un roman
On étudie les fréquences des lettres dans un texte. Les fréquences (nombres d’occurrences) sont représentées par un dictionnaire : chaque clé est une lettre, et la valeur associée est le nombre de fois où elle apparaît.
Pour séparer les lettres des autres caractères (espaces, ponctuation), on utilise la fonction suivante :
def est_lettre(c):
"""Renvoie True si le caractère c est une lettre, False sinon."""
return ("a" <= c <= "z") or ("A" <= c <= "Z") or (c in "éèàùœ")
Écrire une fonction
frequences_lettres(s)qui renvoie le dictionnaire des fréquences des lettres de la chaînes.print(frequences_lettres("alea jacta est")) # {'a': 4, 'l': 1, 'e': 2, 'j': 1, 'c': 1, 't': 2, 's': 1} print(frequences_lettres("l'élève")) # {'l': 2, 'é': 1, 'è': 1, 'v': 1, 'e': 1}Indice
Parcourir la chaîne caractère par caractère. Pour chaque lettre, repérée avec
est_lettre, ajouter 1 à son compteur si elle est déjà une clé du dictionnaire, sinon créer la clé avec la valeur 1.Code à copier puis compléter
def frequences_lettres(s): freq = {} for c in s: if est_lettre(c): if c in freq: freq[c] = ... else: freq[c] = ... return freqÉcrire une fonction
lettre_freq_max(freqs)qui renvoie la lettre de plus grande fréquence du dictionnairefreqs. S’il y en a plusieurs, on en renvoie une seule.print(lettre_freq_max(frequences_lettres("alea jacta est"))) # a print(lettre_freq_max(frequences_lettres("l'élève"))) # lIndice
C’est une recherche de maximum : parcourir les paires
lettre, freqdefreqs.items()et garder la lettre dont la fréquence est la plus grande rencontrée.Code à copier puis compléter
def lettre_freq_max(freqs): lettre_max = "" freq_max = 0 for lettre, freq in freqs.items(): if freq > ...: lettre_max = ... freq_max = ... return lettre_maxÉcrire une fonction
chargement_texte(fichier)qui lit un fichier texte encodé en UTF-8 et renvoie tout son contenu sous la forme d’une chaîne de caractères. L’utiliser sur le roman Quatrevingt-treize de Victor Hugo, à enregistrer dans le dossier du programme depuis ce lien , pour afficher la lettre la plus fréquente du roman.Indice
open(fichier, "r", encoding="utf-8")ouvre le fichier en lecture avec le bon encodage, etf.read()renvoie tout son contenu en une seule chaîne. Pour le roman : charger le texte, calculer ses fréquences avecfrequences_lettres, puis appliquerlettre_freq_max.Écrire une fonction
lettres_freq_inf(freqs, fseuil)qui renvoie la liste des lettres dont la fréquence est inférieure ou égale àfseuil.print(lettres_freq_inf(frequences_lettres("alea jacta est"), 1)) # ['l', 'j', 'c', 's'] print(lettres_freq_inf(frequences_lettres("l'élève"), 2)) # ['l', 'é', 'è', 'v', 'e']Indice
Partir d’une liste vide et parcourir les paires
lettre, freqavecitems(): ajouter la lettre avecappendquand sa fréquence est inférieure ou égale àfseuil.Afficher la liste des lettres utilisées au plus 100 fois dans le roman.
Indice
Appeler
lettres_freq_infavec le dictionnaire des fréquences du roman, calculé à la question 3, et le seuil 100.
Correction publiée après la séance.