Objectifs du TD : manipuler des fichiers de chaines de caractères

Dans le TD précédent, vous avez géré un stock de CD. Cependant, ce stock était dans une variable qui avait la même valeur initiale à chaque exécution. Cela pose un problème si l'on exécute le programme plusieurs fois : si on le lance une première fois pour acheter 3 cds, puis une deuxième fois, le stock est le même qu'à l'état initial c'est à dire que l'achat précédent n'a pas été pris en compte. Stocker des valeurs de façon permanente, d'une exécution à l'autre, est la notion de persistance. Une façon de résoudre ce problème est de stocker les valeurs dans un fichier de votre répertoire.

Nota Pour simplifier, nous manipulerons dans ce TD seulement des fichiers contenant des chaines de caractères. Si ces chaines de caractères représentent des entiers ou des flottants, il faudra utiliser les fonctions de conversion float ou int.

Le module os

Ce module contient un ensemble de fonctions élémentaires sur les fichiers et les répertoires. Par exemple, afficher le nom du répertoire courant, changer les modes d'accès d'un fichier ou son propriétaire, récupérer la liste des fichiers d'un répertoire, supprimer un fichier, ... Voici quelques fonctions intéressantes (à tester dans l'interprète) :
import os
# affiche le nom du répertoire courant
repertoire = os.getcwd()
print("répertoire courant",repertoire)

# renvoie une liste contenant le nom de tous les fichiers du répertoire courant
listeFichier = os.listdir(repertoire)
print("liste des fichiers",listeFichier)

Lecture et écriture dans des fichiers

On peut accéder à un fichier de deux façons : en lecture pour lire son contenu, en écriture pour modifier son contenu. Dans les deux cas, il faut tout d'abord ouvrir le fichier pour récupérer un flux d'entrée/sortie c'est à dire un cannal qui permet la communication entre le programme et le fichier. Ensuite, on peut effectuer des opérations de lecture ou décriture, et pour terminer, il faut fermer le flux. Les exemples suivants illustrent les fonctions élémentaires de lecture/écriture dans un fichier.

Sauver le programme suivant dans un fichier testFichier.py et exécutez-le.
# Pour manipuler des fichiers en lecture/écriture
# par défaut, les fichiers sont supposés être dans le répertoire courant

# écriture
print("exemple d'écriture en ajout")
# ouvre le fichier de nom "exempleFichier" ou le créé si ce fichier n'existe pas
# et renvoie un objet pour le parcourir
# "a" signifie que l'on écrit à la fin du fichier (i.e. on "a"joute des valeurs)
obFichier = open("exempleFichier.txt","a")
# écrit des valeurs
obFichier.write("bonjour")
obFichier.write("les copains")
# pour passer à la ligne il faut mettre "\n"
obFichier.write("il fait beau\n")
obFichier.write("aujourd'hui")
# ferme le fichier (i.e. ferme le flux d'écriture)
obFichier.close()
print("liste des fichiers après écriture",os.listdir(repertoire))

# lecture
print("lecture du fichier que l'on vient de créer")
# par défaut, la fonction open ouvre le fichier en lecture
obFichier = open("exempleFichier.txt")
# on lit le fichier ligne par ligne et on l'affiche
# tant que la ligne n'est pas vide
ligne = " "
while ligne !="":
    print(ligne)
    ligne = obFichier.readline()
obFichier.close()
Dans un terminal, allez dans le répertoire courant d'exécution de Python, c'est à dire dans le répertoire où se trouve testFichier.py. Vérifiez que le fichier "exempleFichier.txt" existe bien et affichez son contenu. Exécutez une deuxième fois le programme testFichier.py et affichez à nouveau le contenu de "exempleFichier.txt".

Sauver maintenant le programme suivant dans un fichier testFichier2.py et exécutez-le.
# un autre exemple de manipulation des fichiers

print("exemple d'écriture en effacement")
# ouvre le fichier de nom "exempleFichier" ou le créé si ce fichier n'existe pas
# et renvoie un objet pour le parcourir
# "w" signifie "write" : on écrit au début du fichier en écrasant
# ce qu'il y avait déjà dans le fichier
obFichier = open("exempleFichier.txt","w")
# écrit des valeurs
obFichier.write("c'est la nouvelle\n valeur")
obFichier.write("du fichier \n exempleFichier")
# ferme le fichier (i.e. ferme le flux d'écriture)
obFichier.close()
Dans un terminal, regardez le contenu du fichier "exempleFichier.txt".

Exercices

  1. Modifier votre programme testFichier.py pour créer un fichier "exempleFichier2.txt" en écrivant les valeurs de votre choix et vérifiez le contenu de "exempleFichier2.txt" en l'affichant dans un terminal.

  2. Remarque
    Dans les exercices suivants, il est indispensable d'utiliser des fonctions !

  3. Ecrire un programme qui lit un nom de répertoire, qui affiche les fichiers de ce répertoire et qui demande le nom d'un fichier d'extension ".py" de ce répertoire. Il affiche ensuite le nombre de commentaires de ce fichier Python. Le nom du fichier est demandé tant que ce fichier n'existe pas ou qu'il ne s'agit pas d'un fichier d'extension ".py". Exemple d'exécution :
    Quel répertoire ? /home/helen/enseignement/algoProgCIP1/tds/td1
    
    Les fichiers du répertoire
    /home/helen/enseignement/algoProgCIP1/tds/td1 sont :
    
    ['exo3.py', 'essai5-exemple.py', 'exo2.py', 'essai1.py', 'variable.py', 'exo5.py', 'exo6-v2.py', 'exo4.py', 'exo6.py', 'td1.ps'] 
    
    nom du fichier .py à ouvrir : toto
    nom du fichier .py à ouvrir : td1.ps
    nom du fichier .py à ouvrir : exo6.py
    
    Il y a 3 commentaires dans le fichier /home/helen/enseignement/algoProgCIP1/tds/td1/exo6.py
    
    Aide : pour savoir si une valeur apparait dans une liste, il suffit d'utiliser la fonction in. Par exemple, si c=["il","fait","beau"], "fait" in c renvoie True tandis que "toto" in c renvoie False

  4. Copier le fichier eleves.txt dans votre répertoire. Ce fichier contient sur chaque ligne une chaine de caractères de la forme : "nom prénom note". Reprendre le programme du TD sur les listes pour afficher les élèves et leurs notes, calculer la moyenne de la classe et afficher le major de la promotion.
    Aide : il est recommandé de lire le fichier et de mettre les informations dans une liste puis de travailler sur la liste.
    Pour décomposer la ligne représentant l'élève, vous pouvez utiliser la fonction split(). Par exemple, si c="Collavizza Hélène 12.5", c.split() renvoie la liste : ['Collavizza', 'Hélène', '12.5'].

  5. Reprendre votre programme de gestion d'un stock de CD en stockant les CDs dans un fichier "stockCD.txt". Ce fichier contient sur chaque ligne une chaine de caractères de la forme "titre groupe type prix nombreExemplaires". Vous pouvez utiliser ce fichier initial. Pour ré-utiliser au mieux le code que vous avez écrit au TD précédent, il est recommandé de procéder de la façon suivante :

  6. Jeu du pendu. Utiliser ce dictionnaire de mots français pour réaliser un jeu du pendu. Le mot à chercher est tiré au hasard dans la liste des mots du dictionnaire, on doit pouvoir jouer au pendu plusieurs fois, tant qu'on en a envie, et sans retomber sur le même mot. Le dessin de la potence pourra être fait avec le module turtle.
    Il est recommandé de lire le dictionnaire et de stocker les mots dans une liste. Ce dictionnaire provient de freelang . Il a été créé avec le codage iso-8859-15. Pour le lire avec Python qui attend de l'utf-8 il faut écrire :
    open(name,encoding="iso-8859-15")
    De plus, chaque ligne est un mot qui se termine par un espace. Quand vous construisez la liste des mots, il est recommandé de supprimer le dernier caractère.


  7. à retenir A RETENIR
    Les fichiers de caractères permettent de stocker des données de façon permanente sur la machine. 
    Ces données peuvent être lues, écrites et modifiées. Dans tous les langages, 
    écrire ou lire dans un fichier consiste à :
    
    1. ouvrir un canal d'entrées/sortie en lecture ou écriture. Pour l'écriture on
     choisit d'écrire au début du fichier en écrasant les valeurs précédentes 
    ou à la fin du fichier.
    
    2. faire les opérations de lecture/écriture.
    
    3. fermer le canal.
    
    Un opérateur spécifique permet de savoir quand on a atteint la fin du fichier.
    

    Collavizza Hélène
    Last modified: Mon Jan 3 15:38:57 CET 2011