« Programmation Python/Fichiers » : différence entre les versions

Contenu supprimé Contenu ajouté
déplacé des chaines
Ligne 906 :
</source>
</li>
 
<li>Réfléchissez !</li>
 
<li>Réfléchissez !</li>
</ol>
{{fin}}
 
{{Exercices}}
<ol>
<li>Complétez l'exercice (mini-système de base de données) en lui ajoutant deux fonctions : l'une pour enregistrer le dictionnaire résultant dans un fichier texte, et l'autre pour reconstituer ce dictionnaire à partir du fichier correspondant.
 
Chaque ligne de votre fichier texte correspondra à un élément du dictionnaire. Elle sera formatée de manière à bien séparer :
 
* la clé et la valeur (c'est-à-dire le nom de la personne, d'une part, et l'ensemble : « âge + taille », d'autre part.
 
* dans l'ensemble « âge + taille », ces deux données numériques.
 
Vous utiliserez donc deux caractères séparateurs différents, par exemple « @ » pour séparer la clé et la valeur, et « # » pour séparer les données constituant cette valeur :
 
<pre>
Juliette@18#1.67
Jean-Pierre@17#1.78
Delphine@19#1.71
Anne-Marie@17#1.63
 
etc.
</pre>
</li>
<li>Améliorez encore le script de l'exercice précédent, en utilisant un dictionnaire pour diriger le flux d'exécution du programme au niveau du menu principal.
Votre programme affichera par exemple :
 
<pre>
Choisissez :
(R)écupérer un dictionnaire préexistant sauvegardé dans un fichier
(A)jouter des données au dictionnaire courant
(C)onsulter le dictionnaire courant
(S)auvegarder le dictionnaire courant dans un fichier
(T)erminer :
</pre>
 
Suivant le choix opéré par l'utilisateur, vous effectuerez alors l'appel de la fonction correspondante en la sélectionnant dans un dictionnaire de fonctions.</li>
</ol>
{{solution}}
<ol>
<li>
 
Sauvegarde d'un dictionnaire :
<source lang=python>
def enregistrement():
fich = raw_input("Entrez le nom du fichier de sauvegarde : ")
ofi = open(fich, "w")
# parcours du dictionnaire entier, converti au préalable en une liste :
for cle, valeur in dico.items():
# utilisation du formatage des chaînes pour créer l'enregistrement :
ofi.write("%s@%s#%s\n" % (cle, valeur[0], valeur[1]))
ofi.close()
 
def lectureFichier():
fich = raw_input("Entrez le nom du fichier de sauvegarde : ")
try:
ofi = open(fich, "r")
except:
print "*** fichier inexistant ***"
return
 
while 1:
ligne = ofi.readline()
if ligne =='': # détection de la fin de fichier
break
enreg = ligne.split("@") # restitution d'une liste [clé,valeur]
cle = enreg[0]
valeur = enreg[1][:-1] # élimination du caractère de fin de ligne
data = valeur.split("#") # restitution d'une liste [âge, taille]
age, taille = int(data[0]), float(data[1])
dico[cle] = (age, taille) # reconstitution du dictionnaire
ofi.close()
</source>
 
Ces deux fonctions peuvent être appelées respectivement à la fin et au début du programme principal, comme dans l'exemple ci-dessous :
 
<source lang=python>
dico ={}
lectureFichier()
while 1:
choix = raw_input("Choisissez : (R)emplir - (C)onsulter - (T)erminer : ")
if choix.upper() == 'T':
break
elif choix.upper() == 'R':
remplissage()
elif choix.upper() == 'C':
consultation()
enregistrement()
</source>
</li>
<li>
Cet exercice complète le précédent. On ajoute encore deux petites fonctions, et on réécrit le corps principal du programme pour diriger le flux d'exécution en se servant d'un dictionnaire :
<source lang=python>
# Contrôle du flux d'exécution à l'aide d'un dictionnaire
def sortie():
print "*** Job terminé ***"
return 1 # afin de provoquer la sortie de la boucle
def autre():
print "Veuillez frapper R, A, C, S ou T, svp."
 
dico ={}
fonc ={"R":lectureFichier, "A":remplissage, "C":consultation,
"S":enregistrement, "T":sortie}
while 1:
choix = raw_input("Choisissez :\n" +\
"(R)écupérer un dictionnaire préexistant sauvegardé dans un fichier\n" +\
"(A)jouter des données au dictionnaire courant\n" +\
"(C)onsulter le dictionnaire courant\n" +\
"(S)auvegarder le dictionnaire courant dans un fichier\n" +\
"(T)erminer : ")
# l'instruction ci-dessous appelle une fonction différente pour
# chaque choix, par l'intermédiaire du dictionnaire <fonc> :
if fonc.get(choix, autre)():
break
# Rem : toutes les fonctions appelées ici renvoient <None> par défaut,
# sauf la fonction sortie() qui renvoie 1 => sortie de la boucle
</source>
</li>
</ol>
{{fin}}