📅  最后修改于: 2020-11-07 08:23:11             🧑  作者: Mango
Python的序列化和反序列化术语分别为酸洗和反酸洗。在Python库中的泡菜模块,使用非常的Python特定的数据格式。因此,非Python应用程序可能无法正确反序列化腌制的数据。还建议不要从未经身份验证的来源释放数据。
序列化(腌制)的数据可以存储在字节字符串或二进制文件中。该模块定义了dumps()和load()函数,以使用byte 字符串来腌制和释放数据。对于基于文件的进程,该模块具有dump()和load()函数。
Python的pickle协议是在Python对象与二进制数据之间进行构造和解构的约定。目前,泡菜模块定义了5种不同的协议,如下所示-
Sr.No. | Names & Description |
---|---|
1 |
Protocol version 0 Original “human-readable” protocol backwards compatible with earlier versions. |
2 |
Protocol version 1 Old binary format also compatible with earlier versions of Python. |
3 |
Protocol version 2 Introduced in Python 2.3 provides efficient pickling of new-style classes. |
4 |
Protocol version 3 Added in Python 3.0. recommended when compatibility with other Python 3 versions is required. |
5 |
Protocol version 4 was added in Python 3.4. It adds support for very large objects |
pickle模块由dumps()函数组成,该函数返回腌制数据的字符串表示形式。
from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (dctstring)
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.
使用loads()函数来解字符串并获取原始字典对象。
from pickle import load
dct=loads(dctstring)
print (dct)
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
也可以使用dump()函数将腌制的对象持久存储在磁盘文件中,并使用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()
pickle模块还以Pickler和Unpickler类的形式为序列化机制提供了面向对象的API。
如上所述,就像Python的内置对象一样,用户定义类的对象也可以在磁盘文件中持久化序列化。在下面的程序中,我们定义一个User类,其名称和手机号码为其实例属性。除了__init __()构造函数之外,该类还覆盖__str __()方法,该方法返回其对象的字符串表示形式。
class User:
def __init__(self,name, mob):
self.name=name
self.mobile=mob
def __str__(self):
return ('Name: {} mobile: {} '. format(self.name, self.mobile))
为了在文件中腌制上面类的对象,我们使用了pickler类及其dump()方法。
from pickle import Pickler
user1=User('Rajani', 'raj@gmail.com', '1234567890')
file=open('userdata','wb')
Pickler(file).dump(user1)
Pickler(file).dump(user2)
file.close()
相反,Unpickler类具有load()方法来检索序列化对象,如下所示:
from pickle import Unpickler
file=open('usersdata','rb')
user1=Unpickler(file).load()
print (user1)