Le premier reflexe lorsqu'on veut sauvegarder un fichier, c'est de se demander qu'elle strucutre je vais utiliser ? Si c'est un fichier contenant des resultats, comme une liste de flottant, je vais ecrire ligne par ligne dans mon fichier la valeur de chaque entree de la liste. Si c'est un fichier de configuration ou autres, on va reflechire a une structure plus complexe, si je prends l'exemple d'un carnet d'adresse contenant NOM, PRENOM, NUMERO, ADRESSE, ... on va ecrire pour chaque individue dans le carnet d'adresse, la sequence NOM_0, PRENOM_0, NUMERO_0, ADRESSE_0, NOM_1, PRENOM_1, ... l'une a la suite de l'autre dans le fichier de sauvegarde. Si maintenant j'ai quelque chose d'encore plus complexe par exemple, je ne sais pas, une note a personnel pour chaque personne de mon carnet, on voie tres bien que cela devient vite une usine a gaz pour sauvegarder et lire les donnes. On est tous passer par la, lorsqu'on a fait un peu de C/C++. Il existe dans certain language (genre Matlab) la possibilite de sauvegarder ses variables dans le but de les re-utilisers plus tard. Bien evidemment, python a une fonction qui utilise se merveilleux principe qui nous simplifie la vie pour la sauvegarde/lecture de donnees.
pickle est un module d'une simplicite, s'en est presque deprimant, lorsque je me rememore le temps perdus a la programmation de fichier de sauvegarde....pfff. Avec pickle, vous prennez la variable et vous la sauvegardee. Pour la lire il suffit de la charger. C'est finie. Je prend un exemple : je desire sauvegarder des mesures de temperatures (flottant de 0 a 100), avec le nom de l'endroie de la mesure (chaine de caracteres taille inconnue), ainsi que l'humidite (entier de 0 a 100). Pour chaque mesure j'ai des types de variable differentes, flottant, entier et chaine de caracteres. Pour chaque mesure je sauvegarde dans un dictionnaire comme ceci :
nombre_de_mesure = 10
# on fait sa petite structure
data = {}
data['nom'] = [None] * nombre_de_mesure
data['temp'] = [0.0] * nombre_de_mesure
data['hygro'] = [0] * nombre_de_mesure
for n in xrange(nombre_de_mesure):
data['nom'][n] = 'nom_%d' % n # je met des trucs bidons
data['temp'][n] = (n * 10)/2.1 # je remplit de flottant
data['hygro'][n] = n * 10 # je remplit d'entier
si on fait un print data, on obtient ca :
{'hygro': [0, 10, 20, 30, 40, 50, 60, 70, 80, 90], 'nom': ['nom_0', 'nom_1', 'nom_2', 'nom_3', 'nom_4', 'nom_5', 'nom_6', 'nom_7', 'nom_8', 'nom_9'], 'temp': [0.0, 4.7619047619047619, 9.5238095238095237, 14.285714285714285, 19.047619047619047, 23.80952380952381, 28.571428571428569, 33.333333333333329, 38.095238095238095, 42.857142857142854]}
vous vous imaginez devoir sauvegarder ca en C, c'est faisable mais bon, moi je fais comme cela :
import pickle
f = open('monfichier.toto', 'w') # ouverture du fichier en ecriture
pickle.dump(data, f)
f.close()
C'est rapide hein... je sais c'est deprimant de ne pas avoir connu sa plus tot, c'est ce que je me suis dit le jour ou c'est decouver pickle. Bon, si on va voir maintenant dans le fichier monfichier.toto, pickle a cree une structure de sauvegarde pour vous, regardons le fichier :
(dp0
S'hygro'
p1
(lp2
I0
aI10
aI20
aI30
aI40
aI50
aI60
aI70
aI80
aI90
asS'nom'
p3
(lp4
S'nom_0'
p5
aS'nom_1'
p6
aS'nom_2'
p7
aS'nom_3'
p8
aS'nom_4'
p9
aS'nom_5'
p10
aS'nom_6'
p11
aS'nom_7'
p12
aS'nom_8'
p13
aS'nom_9'
p14
asS'temp'
p15
(lp16
F0.0
aF4.7619047619047619
aF9.5238095238095237
aF14.285714285714285
aF19.047619047619047
aF23.80952380952381
aF28.571428571428569
aF33.333333333333329
aF38.095238095238095
aF42.857142857142854
as.
Maintenant d'un autre logiciel, on d'une autre session de votre soft, pour lire votre fichier c'est comme ceci :
import pickle
f = open('monfichier.toto', 'r') # ouverture du fichier en mode lecture
data = pickle.load(f)
f.close()
si vous demandez les donnees pour la 3ieme mesure
print 'nom: %s T = %6.2f C hyg = %2d %%' % (data['nom'][2], data['temp'][2], data['hygro'][2])
on obtient ceci:
nom: nom_2 T = 9.52 C hyg = 20 %
on aurrait put definir la strucutre du dictionnaire differemment au lieu de data['nom'] = [liste des nom], travailler par mesure :
data[0] = ['nom_1', 12.3456, 20]
de toute facons dans tous les cas c'est pickle qui gere la structure du fichier, et on peut sauvegarder bien plus que list et dictionnaire, allez voir sur le net.