Python Data Persistence 简明教程
Python Data Persistence - Pickle Module
Python 中序列化和反序列化的术语分别为 pickle 和 unpickle。Python 库中的 pickle 模块使用非常特定的 Python 数据格式。因此,非 Python 应用程序可能无法正确反序列化 pickle 数据。还建议不要从未经身份验证的源中反序列化数据。
序列化的(pickle)数据可以存储在字节字符串或二进制文件中。此模块定义了 dumps() 和 loads() 函数,使用字节字符串对数据进行 pickle 和 unpickle 处理。对于基于文件的进程,该模块具有 dump() 和 load() 函数。
Python 的 pickle 协议是用于构建和解构 Python 对象到/从二进制数据中的约定。目前,pickle 模块定义了如下列出的 5 个不同的协议−
Sr.No. |
Names & Description |
1 |
Protocol version 0 与早期版本向后兼容的原始“可读”协议。 |
2 |
Protocol version 1 旧的二进制格式也兼容 Python 的早期版本。 |
3 |
Protocol version 2 在 Python 2.3 中引入,提供对新式类的高效序列化。 |
4 |
Protocol version 3 在 Python 3.0 中添加。当需要与其他 Python 3 版本兼容时推荐使用。 |
5 |
Protocol version 4 在 Python 3.4 中添加。它增加了对非常大的对象的支持。 |
Example
pickle 模块包含返回腌制数据的字符串表示形式的 dumps() 函数。
from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (dctstring)
Output
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.
Output
{'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 模块还提供了面向对象 API,用于以 Pickler 和 Unpickler 类形式表示的序列化机制。
如上所述,就像 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)