Tutoriel de pickle ( )
PRESENTATION DU MODULE PICKLE.
Le module pickle fournit des classes et des méthodes permettant de sauvegarder, sur un support non volatil, disque dur, clé usb, carte mémoire, ... , tous d'objets natif de Python et de les restituer dans leur état au moment de la sauvegarde, sans que l'utilisateur ait besoin de se préoccuper de la structure interne de l'objet.
pickle est un module de la bibliothèque standard de Python 3. Il est donc toujours disponible.
UTILISATION DU MODULE PICKLE.
1. Importer le module pickle.
import pickle
2. Créer des objets quelconques.
LST_Jours = [ "Lundi" , "Mardi" , "Mercredi" , "Jeudi" , "Vendredi" , "Samedi" , "Dimanche" ]
TPL_Mois = ( "Janvier" , "Février" , "Mars" , "Avril" , "Mai" , "Juin" , "Juillet" , "Aout" , "Septembre" , "Octobre" , "Novembre" , "Décembre" )
DCT_Abreviations = { "lundi" : [ "L" , "lun" ] , "mardi" : [ "M" , "mar" ] , "mercredi" : [ "M" , "mer" ] , "jeudi" : [ "J" , "jeu" ] , "vendredi" : [ "V" , "ven" ] , "samedi" : [ "S" , "sam" ] , "dimanche" : [ "D" , "dim" ] }
3. Sauvegarder des objets.
Pour convertir l'objet à sauvegarder en fichier (binaire) on utilise la méthode pickle.dump ( ). Les objets sauvegardés sous forme de fichiers, sont toujours écrit en binaire par pickle, il faut donc le préciser à la méthode open ( ) par "wb". Pour plus de sûreté, utilisez toujours l'instruction with pour travailler sur vos fichiers. N.B. Dans cet exemple, le fichier sauvegardant les données et la structure de l'objet sera déposé dans le répertoire courant, ou de travail, mais est tout à fait possible de le placer dans un dossier distant en indiquant un nom de fichier absolu (lecteur/répertoire/fichier/extension).
with open ( "les jours.lst" , "wb" ) as kjours :
pickle.dump ( LST_Jours , kjours )
with open ( "les mois.tpl" , "wb" ) as kmois :
pickle.dump ( TPL_Mois , kmois )
with open ( "les abreviations.dct" , "wb" ) as ksave :
pickle.dump ( DCT_Abreviations , ksave )
4. Modifier les objets parents.
LST_Jours [ : ] = [ "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" , "Sunday" ]
TPL_Mois = ( "Januar" , "Februar" , "März" , "April" , "Mai" , "Juni" , "Juli" , "August" , "September" , "Oktober" , "November" , "Dezember" )
DCT_Abreviations = { "lundi" : "lun" , "mardi" : "mar" , "mercredi" : "mer" , "jeudi" : "jeu" , "vendredi" : "ven" , "samedi" : "sam" , "dimanche" : "dim" }
5. Récupérer les objets sauvegardés.
Les objets ont été sauvegardés sous forme de fichiers binaires par pickle, il faut donc le préciser à la méthode open ( ) par "rb".
Pour récupérer l'objet dans sa structure de base on utilise la méthode pickle.load ( ).
with open ( "les jours.lst" , "rb" ) as ksemaine :
LST_Semaine = pickle.load ( ksemaine )
with open ( "les mois.tpl" , "rb" ) as kannee :
LST_Annee = pickle.load ( kannee )
with open ( "les abreviations.dct" , "rb" ) as kload :
TPL_Annee = pickle.load ( kload )
6. Comparaison et vérification.
print ( "Les objets récupérés et leur type :" )
print ( LST_Semaine , type ( LST_Semaine ) , " " , sep = "\n" )
print ( TPL_Annee , type ( TPL_Annee ) , " " , sep = "\n" )
print ( DCT_Reduction , type ( DCT_Reduction ) , " " , sep = "\n )
print ( "Les objets parents :" )
print ( LST_Jours )
print ( TPL_Mois )
print ( DCT_Abreviations )
retourne :
['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche']
<class 'list'>
('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre')
<class 'tuple'>
{'lundi': ['L', 'lun'], 'mardi': ['M', 'mar'], 'mercredi': ['M', 'mer'], 'jeudi': ['J', 'jeu'], 'vendredi': ['V', 'ven'], 'samedi': ['S', 'sam'], 'dimanche': ['D', 'dim']}
<class 'dict'>
Les objets parents :
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember')
{'lundi': 'lun', 'mardi': 'mar', 'mercredi': 'mer', 'jeudi': 'jeu', 'vendredi': 'ven', 'samedi': 'sam', 'dimanche': 'dim'}
REMARQUES.
Pour éviter des interruptions du programmes, il est conseillé de placer les routines de lecture/écriture de fichiers dans des blocs try / except / finaly.
Pour l'écriture :
try :
with open ( "les jours.lst" , "wb" ) as kjours :
pickle.dump ( LST_Jours , kjours )
except :
print ( "Une erreur est survenue./nL'objet n'a pas pu être sauvegardé correctement." )
Pour la lecture :
try :
with open ( "les jours.lst" , "rb" ) as ksemaine :
LST_Semaine = pickle.load ( ksemaine )
except :
print ( "Une erreur est survenue./nL'objet n'a pas pu être récupéré correctement." )
LST_Semaine = [ ]
Bien que vivement déconseillée, voici un exemple sans bloc with et try.
# --- Initialisation ---
import pickle
LST_Jours = [ "Lundi" , "Mardi" , "Mercredi" , "Jeudi" , "Vendredi" , "Samedi" , "Dimanche" ]
# --- Sauvegarde de l'objet ---
kjours = open ( "les jours.lst" , "wb" )
pickle.dump ( LST_Jours , kjours )
kjours.close ( )
# --- Récupération de l'objet ---
klecture = open ( "les jours.lst" , "rb" )
LST_Semaine = pickle.load ( klecture )
klecture.close ( )
# --- Controle de l'opération ---
print ( "LST_Jours" , LST_Jours )
print ( "LST_Semaine" , LST_Semaine )
print ( type ( LST_Semaine ) )
Le module pickle dispose aussi des méthodes pickle.dumps ( ) et pickle.loads ( ) pour convertir un objet python quelconque en un bytes ( ), c'est-à-dire une suite d'octets, et/ou de le reconstituer avec sa structure originale. Cela peut être utile pour transmettre un objet par un réseau. NB. La méthode pickle.dumps ( ) ne sauvegarde pas la conversion sur un support physique et la méthode pickle.loads ( ) ne charge pas un bytes ( ) depuis une sauvegarde.
import pickle
LST_Jours = [ "Lundi" , "Mardi" , "Mercredi" , "Jeudi" , "Vendredi" , "Samedi" , "Dimanche" ]
kconvertion = pickle.dumps ( LST_Jours )
LST_Semaine = pickle.loads ( kconvertion )
print ( kconvertion , type ( kconvertion ) )
print ( LST_Semaine , type ( LST_Semaine ) )
Notez aussi que la documentation officielle de Python donne ces avertissements.
"Le module pickle n'est pas sécurisé. Ne sélectionnez que les données auxquelles vous faites confiance. Il est possible de construire des données de pickle malveillantes qui exécuteront du code arbitraire lors du décapage. Ne supprimez jamais les données qui auraient pu provenir d'une source non fiable ou qui auraient pu être falsifiées. Envisagez de signer des données avec hmac si vous devez vous assurer qu'elles n'ont pas été falsifiées. Des formats de sérialisation plus sûrs tels que json peuvent être plus appropriés si vous traitez des données non fiables. Voir Comparaison avec json."
"La sérialisation est une notion plus primitive que la persistance; bien que pickle lit et écrit des objets de fichier, il ne gère pas le problème de la dénomination des objets persistants, ni le problème (encore plus compliqué) de l'accès simultané aux objets persistants. Le module pickle peut transformer un objet complexe en un flux d'octets et il peut transformer le flux d'octets en un objet avec la même structure interne. La chose la plus évidente à faire avec ces flux d'octets est peut-être de les écrire sur un fichier, mais il est également concevable de les envoyer sur un réseau ou de les stocker dans une base de données. Le module shelve fournit une interface simple pour décaper et décoller des objets sur des fichiers de base de données de style DBM. "
LISTE DES METHODES DU MODULE PICKLE.
dump ( ) : sauvegarde un objet sur un support physique.
dumps ( ) : convertit un objet en bytes ( ).
load ( ) : charge un objet depuis un support physique.
loads ( ) : restitue un objet depuis un bytes ( ) valide.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
Dans la LOGITHEQUE de MON PYTHON PAS A PAS
vous trouvez des suggestions de projets simples et classiques pour
ooo
TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER
ooo
la programmation récréative avec le langage PYTHON 3
avec un exemple de résolution à télécharger pour vous inspirer.