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.txt en lecture et le ferme automatiquement à la fin du bloc
  • C. Elle ouvre f.txt en é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

  1. Écrire un programme qui crée un fichier fruits.txt contenant 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 avec f.write(...), sans oublier \n à la fin du nom : write n’ajoute aucun retour à la ligne.

  2. Vérifier le contenu du fichier en l’ouvrant avec un éditeur de texte.

  3. 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.

  1. É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 et ligne.strip() : sans strip(), le \n de 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 = ...
    
  2. É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')
  1. Sans exécuter le code, prédire le contenu du fichier test.txt.

    Indice

    Qu’ajoute write aprè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.

  2. Vérifier en exécutant le programme.

  3. 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 :

  1. lit toutes les températures ;

    Indice

    Partir d’une liste vide. Pour chaque ligne du fichier, retirer le \n avec strip(), convertir le texte en nombre avec float(), puis ajouter ce nombre à la liste avec append.

    Code à copier puis compléter
    temperatures = []
    with open("mesures.txt", "r") as f:
        for ligne in f:
            temperatures.append(...)
    
  2. affiche la température minimale, la température maximale et la moyenne (arrondie à un chiffre après la virgule).

    Indice

    Les fonctions min, max, sum et len s’appliquent à la liste des températures : la moyenne est la somme divisée par le nombre de valeurs, et round(x, 1) arrondit x à 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 :

  1. 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 avec int(). 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")
    
  2. 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).

  3. 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 "éèàùœ")
  1. Écrire une fonction frequences_lettres(s) qui renvoie le dictionnaire des fréquences des lettres de la chaîne s.

    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
    
  2. Écrire une fonction lettre_freq_max(freqs) qui renvoie la lettre de plus grande fréquence du dictionnaire freqs. 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")))         # l
    
    Indice

    C’est une recherche de maximum : parcourir les paires lettre, freq de freqs.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
    
  3. É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, et f.read() renvoie tout son contenu en une seule chaîne. Pour le roman : charger le texte, calculer ses fréquences avec frequences_lettres, puis appliquer lettre_freq_max.

  4. É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, freq avec items() : ajouter la lettre avec append quand sa fréquence est inférieure ou égale à fseuil.

  5. Afficher la liste des lettres utilisées au plus 100 fois dans le roman.

    Indice

    Appeler lettres_freq_inf avec le dictionnaire des fréquences du roman, calculé à la question 3, et le seuil 100.

Correction publiée après la séance.