python 实用pickle序列化

存储数据结构到一个文件中称为序列化。相json这样的格式需要定制的序列化数据的转换器。python提供了pickle模块以特殊的二进制格式保存和恢复数据对象。

还记得json解析datetime对象时出现问题?但对于pickle就不存在问题:

>>> import pickle
>>> import diatomite
>>> now1 = datetime.datetime.utcnow()
>>> pickled = pickle.dumps(now1)
>>> now2 =pickle.loads(pickled)
>>> now1
datetime.datetime(2017,3,23,22,20,1970)
>>> now2

pickle 同样也适用于自己定义的类和对象。现在,我们定义一个简单的类 tiny,当其对象强制转换为字符串时会返回‘tiny’:

>>> import pickle
>>> class Tiny():
...         def __str__(self):
...         return 'tiny'
...
>>> obj1 = Tiny()
>>> obj1
<__main__.Tiny object at 0x10076ed10>
>>> str(obj1)
'tiny'
>>> pickled = pickle.dumps(obj1)
>>> pickled
b'\x80\x03c__main__\nTiny\nq\x00)\x81q\x01.'
>>> obj2 = pickle.loads(pickled)
>>> obj2
<__main__.Tinyobject at 0x10076e550>
>>> str(obj2)
'tiny'

pickled是从对象obj1转换来的序列化二进制字符串。然后再把字符串还远成对象obj1的副本obj2.使用函数dump()序列化数据到文件,而函数load()用作反序列化。

 

备注:

因为pickle会创建python对象,前面提到的安全问题也同样会发生,不要对你不信任的文件做反序列化。

posted @ 2017-03-23 22:21  jackchen007  阅读(216)  评论(0编辑  收藏  举报