pickle模块实现了二进制序列化和反序列化Python对象。
注意:pickle模块是不够安全的,不要去反序列化一个你不信任的文件
与其他模块相比较
与marshal相比较
Python有一个原始的序列化模块marshal,但是通常优先使用pickle去序列化Python对象,marshal存在的原因是为了支持.pyc文件。
pickle模块和marshal有以下几点不同:
pickle模块会记录对象是否已序列化过,不会多次序列化一个对象,但是marshal可以多次序列化同一个对象。
marshal不能用来序列化用户定义的类和它的实例。pickle可以序列化用户定义的类,但是类定义必须是可以导入的,且被反序列化时,需要和类定义在同一个模块。
和json比较
这两个根本的不同是协议的不同
JSON是文本序列化格式,人可以读的。而pickle是二进制序列化格式,人不可读。
JOSN适用性更强,不仅支持Python,其他很多语言都支持。而pickle是Python独有的。
JSON默认情况下只支持Python内置类型,不支持定制类。pickle可以支持大量的python类型
模块接口
序列化一个对象,你可以简单的调用dumps()函数,反序列化时,你可以调用loads()函数,当然,如果你想在序列化和反序列化时有更多的控制,你可以创建Pickler()和Unpickler对象。
pickle.dump(obj,file,protocol=Node, *, fix_imports=True)
把一个对象序列化到一个文件对象file中,这和使用Pickler(file, protocol).dump(obj)等同。
如果fix_imports为True并且protocol小于3,那么pickle将尝试将Python3中的名字映射到Python2中,以便Python2可以反序列化这些数据。
pickle.dumps(obj, protocol=None, * , fix_imports=True)
返回序列化对象之后的字节数据,而不是像dump那样写到文件中。这在把序列化后的数据不是存到文件中会用到,例如把对象序列化后存到数据库中。
pickle.load(file, *, fix_import=True, encoding=”ASCII”, errors=”strict”)
从文件中反序列化出对象来,和等同于Unpickler(file).load()
pickle.loads(bytes_object, *, fix_imports=True, encoding=”ASCII”, errors=”strict”)
从一个字节对象反序列化出对象,例如从数据库中反序列化出对象。
pickle模块定义了三个异常:
exception pickle.PickleError
其他pickling异常的基类,继承于Exception
exception pickle.PicklingError
序列化或反序列化一个Pickle不支持的对象时抛出,继承于PickleError
exception UnpicklingError
当反序列化一个对象遇到问题时抛出,例如数据损坏或安全原因。
例子:
序列化对象到文件中
import pickle
# An arbitrary collection of objects supported by pickle.
data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': {None, True, False}
}
with open('data.pickle', 'wb') as f:
# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
从文件中反序列化出对象
import pickle
with open('data.pickle', 'rb') as f:
# The protocol version used is detected automatically, so we do not
# have to specify it.
data = pickle.load(f)