← Back to Correction de TD

Correction des TD 3 & 4

Énoncés des TD – Programmation en Python, les bases (PDF) (connexion eCampus requise).

Exercice Lire une fable

Voir la correction

Le programme affiche la fable avec une ligne vide après chaque ligne, comme dans l’exemple du § 8.3.1 : chaque ligne renvoyée par readlines() se termine déjà par \n, et print en ajoute un second. Pour l’éviter, on utilise print(ligne, end="").

# 1. Imports section
# No import needed

# 2. Functions section
# No functions in this exercise

# 3. Main routine section
if __name__ == "__main__":
    mon_fichier = open("fable.txt", "r", encoding="utf-8")  # open the file in read mode
    liste_lignes = mon_fichier.readlines()  # list of str, each one ends with '\n'
    mon_fichier.close()  # always close the file once it has been read

    for ligne in liste_lignes:
        # end="" avoids adding a second '\n' after the one already in the line
        print(ligne, end="")

Exercice Copier une fable

Voir la correction

Rien ne s’affiche dans la console : la fonction copie lit toutes les lignes de fable.txt avec readlines() puis les écrit avec writelines() dans un nouveau fichier fable_copie.txt, créé dans le même dossier (le mode "w" écrase le fichier s’il existe déjà).

La copie fait la même taille que l’original : 702 octets sur Mac et Linux. Sous Windows, elle fait 703 octets, car le fichier de destination est ouvert sans encoding="utf-8" : les 16 lettres accentuées sont écrites sur 1 octet au lieu de 2, et les 17 sauts de ligne \n deviennent \r\n. Pour obtenir une copie identique, on précise l’encodage aussi à l’écriture :

# 1. Imports section
# No import needed


# 2. Functions section
def copie(source, destination):
    """
    Fonction qui copie les lignes du fichier source dans le fichier destination
    et renvoie le nombre de lignes copiées
    """
    file_in = open(source, "r", encoding="utf-8")  # open the source in read mode
    lignes = file_in.readlines()  # read all the lines
    file_in.close()

    # "w" creates the file (or overwrites it if it already exists)
    file_out = open(destination, "w", encoding="utf-8")
    file_out.writelines(lignes)  # write all the lines
    file_out.close()

    return len(lignes)


# 3. Main routine section
if __name__ == "__main__":
    nb_lignes = copie("fable.txt", "fable_copie.txt")
    print(f"{nb_lignes} lignes copiées dans fable_copie.txt")

Exercice fichiers

Voir la correction
# 1. Imports section
# No import needed


# 2. Functions section
def lire_lignes(nom_fichier):
    """
    Fonction qui renvoie la liste des lignes du fichier nom_fichier
    """
    fichier = open(nom_fichier, "r", encoding="utf-8")
    lignes = fichier.readlines()
    fichier.close()
    return lignes


def compte_nb_lignes(nom_fichier):
    """
    Fonction qui renvoie le nombre de lignes du fichier nom_fichier
    """
    return len(lire_lignes(nom_fichier))


def affiche_no_ligne(nom_fichier):
    """
    Fonction qui renvoie le texte du fichier, chaque ligne étant
    précédée par son numéro
    """
    texte = ""
    numero = 1
    for ligne in lire_lignes(nom_fichier):
        # each line already ends with '\n', so the lines stay separated
        texte += str(numero) + " : " + ligne
        numero += 1
    return texte


def decoupe(nom_fichier):
    """
    Fonction qui renvoie, pour chaque ligne du fichier, la liste de ses mots
    """
    liste_mots = []
    for ligne in lire_lignes(nom_fichier):
        # split() without argument cuts on spaces and removes the '\n'
        liste_mots.append(ligne.split())
    return liste_mots


# 3. Main routine section
if __name__ == "__main__":
    # Test on two different files
    for nom in ["fable.txt", "fichier_vide.txt"]:
        print(f"Le fichier {nom} a {compte_nb_lignes(nom)} lignes.")

    print(affiche_no_ligne("fable.txt"))

    for mots in decoupe("fable.txt"):
        print(mots)