📜  Python数据持久性-Pickle模块

📅  最后修改于: 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模块还以PicklerUnpickler类的形式为序列化机制提供了面向对象的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)