Pickle
pickle模块实现了对一个python对象结构的二进制序列化和反序列化,讲一个python对象及其拥有的层次化结构转化为一个字节流
-
与marshal的不同
- pickle会追踪已被序列化的对象,时期之后不会被再次序列化。
- marshal不能用于序列化用户定义类及实例
- pickle可以在不同python版本中实现向后兼容
-
与json的不同
- json是文本序列化格式,pickle是二进制序列化格式
- json是可以直观阅读的,pickle不可阅读
- json是可互操作的,在python外广泛使用,pickle是python专用的
- 默认情况下,json只能表示python内置类型的自己,不能表示自定义的类,pickle可以表示大量python的数据类型
-
可被打包解包的对象
- None、True、False
- 整数、浮点数、复数
- str、byte、bytearray
- 只包含可打包对象的tuple,list,set,dict
- 定义在模块顶层的函数(lamda函数不可以)
- 定义在模块顶层的内置函数
- 定义在模块顶层的类
- 某些类实例
-
常用函数:
pickle.dumps(obj) 将obj对象序列化后返回
pickle.loads(bytes_object) 将序列化对象还原并返回
pickle.dump(obj,file) 将obj对象序列化后写入已打开的文件file中
相当于Pickler(file,protocol).dump(obj)pickle.load(file) 从已打开的文件file中读取对象还原并返回
相当于 Unpickler(file).load()
-
限制全局变量
默认情况下,pickle会解封任何类或函数,可能会加载不安全的代码
需要使用解封器进行限制示例程序
#pickle模块的序列化,pickle序列化时是得到一个bytes
import pickle
d = 'abcdefgh'
#利用pickle.dumps并写入文件
b = pickle.dumps(d) #序列化为bytes
f = open('se.txt','wb')
f.write(b)
f.close()
#利用pickle.dump直接吸入一个file-like object
f = open('se.txt','wb')
pickle.dump(d,f)
f.close()
#反序列化,利用pickle.loads
f = open('se.txt','rb')
bs = f.read()
print(pickle.loads(bs))
f.close()
#反序列化,利用pickle.load直接反序列化一个file-like object
f = open('se.txt','rb')
print(pickle.load(f))
f.close()