Python Data Persistence - Pickle Module

Terminologia Pythona dotycząca serializacji i deserializacji to odpowiednio wytrawianie i rozpakowywanie. Moduł pickle w bibliotece Pythona używa bardzo specyficznego dla Pythona formatu danych. Dlatego aplikacje inne niż Python mogą nie być w stanie poprawnie deserializować marynowanych danych. Zaleca się również, aby nie usuwać danych z nieuwierzytelnionego źródła.

Zserializowane (piklowane) dane mogą być przechowywane w postaci ciągu bajtów lub w pliku binarnym. Ten moduł definiujedumps() i loads()funkcje do wytrawiania i rozpakowywania danych przy użyciu ciągu bajtów. W przypadku procesu opartego na plikach moduł madump() i load() funkcjonować.

Protokoły pickle w Pythonie to konwencje używane przy konstruowaniu i dekonstruowaniu obiektów Pythona do / z danych binarnych. Obecnie moduł pikle definiuje 5 różnych protokołów wymienionych poniżej -

Sr.No. Nazwy i opis
1

Protocol version 0

Oryginalny protokół „czytelny dla człowieka” jest wstecznie zgodny z wcześniejszymi wersjami.

2

Protocol version 1

Stary format binarny jest również zgodny z wcześniejszymi wersjami Pythona.

3

Protocol version 2

Wprowadzone w Pythonie 2.3 zapewnia wydajne wytrawianie klas w nowym stylu.

4

Protocol version 3

Dodano w Pythonie 3.0. zalecane, gdy wymagana jest zgodność z innymi wersjami Python 3.

5

Protocol version 4

został dodany w Pythonie 3.4. Dodaje obsługę bardzo dużych obiektów

Przykład

Moduł pikle składa się z funkcji dumps (), która zwraca ciąg reprezentujący dane marynowane.

from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (dctstring)

Wynik

b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.

Przykład

Użyj funkcji load (), aby rozpakować łańcuch i uzyskać oryginalny obiekt słownika.

from pickle import load
dct=loads(dctstring)
print (dct)

Wynik

{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}

Marynowane obiekty mogą być również trwale przechowywane w pliku dyskowym za pomocą funkcji dump () i pobierane za pomocą funkcji load ().

import pickle
f=open("data.txt","wb")
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()

#to read
import pickle
f=open("data.txt","rb")
d=pickle.load(f)
print (d)
f.close()

Moduł pickle zapewnia również zorientowane obiektowo API dla mechanizmu serializacji w postaci Pickler i Unpickler zajęcia.

Jak wspomniano powyżej, podobnie jak obiekty wbudowane w Pythonie, obiekty klas zdefiniowanych przez użytkownika mogą być również trwale serializowane w pliku dyskowym. W poniższym programie definiujemy klasę użytkownika z nazwą i numerem telefonu jako atrybutami instancji. Oprócz konstruktora __init __ () klasa przesłania metodę __str __ (), która zwraca ciąg znaków reprezentujący swój obiekt.

class User:
   def __init__(self,name, mob):
      self.name=name
      self.mobile=mob
   def __str__(self):
return ('Name: {} mobile: {} '. format(self.name, self.mobile))

Aby zalać obiekt powyższej klasy w pliku używamy klasy pickler i jej metody dump ().

from pickle import Pickler
user1=User('Rajani', '[email protected]', '1234567890')
file=open('userdata','wb')
Pickler(file).dump(user1)
Pickler(file).dump(user2)
file.close()

I odwrotnie, klasa Unpickler ma metodę load () do pobierania zserializowanego obiektu w następujący sposób -

from pickle import Unpickler
file=open('usersdata','rb')
user1=Unpickler(file).load()
print (user1)