Introduction au pickling Python

Gazette Linux n°143 — Octobre 2007

Adaptation française: Marianne Lombard

Relecture de la version française : Deny

Article paru dans le n°143 de la Gazette Linux d'octobre 2007

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Pickler, Depickler
Le module « Pickle »
Le module « cPickle »
Un regard en coulisse
Conclusion
Références

La motivation pour écrire cet article est venue quand je travaillais sur mon premier projet majeur en Python et je souhaitais un moyen d'écrire mes données de classe dans un fichier sur un seul disque, simplement de la façon que j'ai employé à maintes reprises en C, où j'écrivais la structure des données dans un fichier. Alors si vous voulez apprendre la méthode « Pythonique » de stockage persistant de vos données de classe, ceci est pour vous. Commençons !

Pickler, Depickler

Un pickle est un objet Python représentant une chaine d'octets. Cela a l'air parfaitement simple ? Et bien, c'est aussi simple ! Ce processus est appelé Pickling. Donc nous avons converti avec succès notre objet en une chaîne d'octets, maintenant comment pouvons-nous revenir en arrière ? Dépickler signifie reconstruire l'objet Python depuis la chaine picklée d'octets. Pour parler strictement, ce n'est pas une reconstruction dans un sens physique—cela signifie simplement que si nous avons pickler une liste, L, alors après dépicklage, nous retrouvons les contenus de la liste simplement en accedant à L.

Les termes « pickler » et « depickler » se rapportent respectivement à la sérialisation et à la désérialisation objet, qui sont des termes neutres par rapport au langage relatif à un processus qui transforme arbitrairement des objets complexes en représentations textuelles ou binaires de ces objets et inversement.

Le module « Pickle »

Le module pickle implémente les fonctions pour vider les données de l'instance de classe dans un ficher et charger les données picklées pour les rendre utilisables.

Considérons la classe Demo ci-dessous :

import pickle

class Demo:
        def __init__(self):
                self.a = 6
                self.l = ('hello','world')
                print self.a,self.l
	   

Maintenant, vous allez créer une instance de Demo et la pickler :


>>> f=Demo()
6 ('hello', 'world')
>>> pickle.dumps(f)
"(i__main__\nDemo\np0\n(dp1\nS'a'\np2\nI6\nsS'l'\np3\n(S'hello'\np4\nS'world'\np5\ntp6\nsb.

	   

La fonction dumps pickle l'objet et vide l'objet picklé à l'écran. Je suis certain que ce n'est pas vraiment compréhensible et ne semble pas très utile—mais si nous vidons les objets picklés dans un fichier sur un disque, l'utilité augmente beaucoup. C'est ce que nous allons faire ensuite. Modifions légèrement notre code pour inclure le code de pickling :


import pickle

class Demo:
        def __init__(self):
                self.a = 6
                self.l = ('hello','world')
                print self.a,self.l
                

if __name__ == "__main__":
        f=Demo()
        pickle.dump(f, file('Demo.pickle','w'))

	   

Maintenant, nous allons dépickler :


>>> f3=pickle.load(file("Demo.pickle"))
>>> f3.a
6
>>> f3.l
('hello', 'world')
>>> 

	   

Pour l'instant, tout va bien.

Le module « cPickle »

cPickle est un module d'extension écrit en C pour fournir des fonctions de pickling qui sont environ 1000 fois plus rapides que le module pickle. L'utilisation est la même que pickle. Les pickles produits sont compatibles entre eux.


>>> import cPickle
>>> f3=cPickle.load(file("Demo.pickle"))
>>> f3.l
('hello', 'world')

	

Un regard en coulisse

Le format de données utilisé par pickle est spécifique à Python, ce qui disqualifie le pickling comme option de stockage persistant si vous recherchez une solution neutre pour le langage. Le format par défaut utilisé par Python pour écrire des objets picklés est humainement lisible et donc aisement déboguable en ASCII. Il y a trois protocoles différents qui peuvent être utilisés pour le pickling :

  • Le protocole version 0 est le protocole ASCII original et il est retro-comptatible avec les versions précédentes de Python

  • Le protocole version 1 est l'ancien format binaire qui est également compatible avec les anciennes versions de Python

  • Le protocole version 2 a été introduit avec Python 2.3. Il fournit un pickling plus efficace pour les classes de nouveau style.

Conclusion

Le but premier de ce court tutoriel était une introduction pragmatique sur le pickling Python comme une méthode d'écriture des classes de données dans un stockage persistant, spécialement pour les nouveaux programmeurs Python. J'ai volontairement laissé de coté les questions relatives au travail avec des classes plus grosses et complexes, pour lesquelles certaines ressources appréciables sont énumérées plus bas. Encore une fois, les choses les plus basiques comme pickler de simples listes et dictionnaires ont été omises, mais ne demanderont pas de longues recherches pour trouver la réponse. J'espère que vous êtes prêts à utiliser le pickling dans vos projets. Bon développement !

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.