← 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)