Cours de développement Python avancé
Chapitre
>
Niveau
Modules de sérialisation
Modules Marshal et Pickle
Objectif
Allez à la station de service et assurez-vous que les données sont correctement stockées en utilisant le module JSON pour formater les fichiers.
En poursuivant le long du sentier, nous trouvons quelques stations surveillant la distribution d’eau et la qualité du sol pour la terre en cours d’aménagement pour une future récolte. Afin de traiter les données, il est efficace de les sérialiser. Bien que l’utilisation de JSON puisse être efficace comme solution générale, il existe aussi quelques méthodes de sérialisation spécifiques à Python, à savoir les modules Marshal et Pickle. Le module Marshal est conçu pour une sérialisation/désérialisation rapide en convertissant les données en binaire, idéal pour des transferts de données simples. Le module Pickle est plus lent mais il est conçu pour traiter des structures de données plus complexes et est beaucoup plus flexible, idéal pour des structures de données volumineuses ou prioritaires.
Pour utiliser les modules Marshal et Pickle, importez leurs fonctions en écrivant : import marshal et import pickle. Pour nos besoins, nous utiliserons les fonctions suivantes :
marshal.dumps(): sérialise les données en un format binaire, conçu pour la rapidité dans Python. Prend un argument, à savoir les données que vous souhaitez sérialiser, et se limite aux types de base.marshal.loads(): désérialise les données binaires en types de données Python lisibles, limité dans ses capacités mais s’exécutant rapidement. Prend un argument, à savoir les données à désérialiser.pickle.DEFAULT_PROTOCOL: vérifie la version de protocole par défaut pour la sérialisation avec Pickle dans votre version de Python. Les protocoles influent sur la façon dont les données sont sérialisées.pickle.HIGHEST_PROTOCOL: vérifie la version de protocole la plus élevée disponible pour la sérialisation avec Pickle dans votre version de Python. Les protocoles influent sur la façon dont les données sont sérialisées.pickle.dumps(): sérialise des structures de données Python complexes en format binaire selon le protocole utilisé. Prend deux arguments : les données à sérialiser et la version du protocole à utiliser lors de la sérialisation.pickle.loads(): désérialise les données binaires en types de données Python lisibles, puissant pour les objets Python. Prend un argument, à savoir les données à désérialiser.
En plus de ces modules et fonctions, nous utiliserons également un module de formatage nommé pformat, que nous importerons avec from pprint import pformat. Cela nous permet d’utiliser la fonction pformat(), qui sert à formater des structures de données comme des dictionnaires, nous permettant d’afficher l’information clairement.
Pour commencer, avancez jusqu’à la marque X lumineuse à l’intérieur de la petite station de surveillance et faites face à la console. La station surveille la pression de l’eau et les conditions du sol du terrain voisin en cours d’aménagement pour la plantation de cultures. Une constante nommée reading contient les données Python collectées par la station.
Créez une variable nommée data et affectez-lui la valeur de la fonction marshal.dumps() en passant reading en argument. Comme suit : data = marshal.dumps(reading). Utilisez la variable data avec la fonction pré-écrite display() pour visualiser les données sérialisées.
Sortez de la station et dirigez-vous vers la marque X dorée, utilisez la fonction open() pour ouvrir la porte et accéder au bureau. Avancez jusqu’à la marque X lumineuse devant la console et désérialisez les données que vous venez de sérialiser. Créez une variable nommée output et affectez-lui la valeur de marshal.loads() en passant la variable data en argument. Utilisez la fonction write() en y ajoutant output comme argument pour accéder aux données sérialisées que vous avez collectées à la station de surveillance.
Avancez jusqu’à la marque X lumineuse sur la moquette bleue dans le bureau, nous vérifierons sur la console les protocoles pour déterminer quel type de sérialisation le module pickle utilisera lors du traitement des données. Dans la fonction pré-écrite write(), définissez les arguments sur pickle.DEFAULT_PROTOCOL et pickle.HIGHEST_PROTOCOL. Cela permettra de vérifier le protocole de sérialisation actuel ainsi que le dernier protocole disponible à ce jour.
Dirigez-vous vers la marque X sombre sur la moquette bleue. Maintenant que nous avons confirmé les protocoles, nous pouvons vérifier les données stockées. Des données ont été collectées et stockées au fil des mois dans une constante nommée samples. Créez trois variables nommées sereal_0, sereal_2 et sereal_5. Nous les utiliserons pour tester trois des protocoles de sérialisation disponibles. Le protocole 0 est en ASCII lisible, peu efficace, le protocole 2 est un format binaire plus efficace et le protocole 5 est le plus récent avec les fonctionnalités les plus avancées.
Nous assignerons à chaque variable la valeur de pickle.dumps() en passant en arguments la constante samples et le numéro de protocole correspondant au nom de la variable. Par exemple, pour sereal_0, nous utiliserons protocol=0 ainsi : sereal_0 = pickle.dumps(samples, protocol=0). Utilisez sereal_0, sereal_2 et sereal_5 avec la fonction pré-écrite display() pour voir les différences de sérialisation selon chaque protocole.
Avancez jusqu’à la marque X lumineuse sur la moquette rouge et faites face à la console, écrasez la variable output en lui affectant la valeur de pickle.loads() avec sereal_5 en argument afin de désérialiser les données d’échantillons recueillies jusqu’à présent. Utilisez la fonction display() et enchaînez avec pformat() sur la variable output pour afficher les données, comme ceci : await player.display(pformat(output)). Notez les évaluations pour chaque mois affichées à l’écran afin de les consigner ultérieurement.
Dirigez-vous vers la marque X sombre sur la moquette rouge et faites face au bureau. Dans la fonction pré-écrite write(), ajoutez les évaluations que vous avez notées pour chaque mois, telles qu’elles ont été précédemment affichées. Ajoutez-les en tant que chaînes de caractères entre guillemets (""), dans l’ordre exact indiqué dans la fonction, afin de terminer le niveau.