您的位置:首页 > 编程语言 > Python开发

python 序列化之pickle

2016-07-26 14:26 489 查看
如果希望透明地存储 Python 对象而不丢失其身份和类型等信息则需要某种形式的对象序列化它是一个将任意复杂的对象转成对象的文本或二进制表示的过程。同样必须能够将对象经过序列化后的形式恢复到原有的对象。在 Python 中这种序列化过程称为 pickle可以将对象 pickle 成字符串、磁盘上的文件或者任何类似于文件的对象也可以将这些字符串、文件或任何类似于文件的对象 unpickle 成原来的对象。我们将在本文后面讨论 pickle的两组函数
(1)dumps(),loads()方法
和json模块一样pickle模块同样有dumps()和load()方法只是输出和结果上和json不同pickle输出的是二进制格式json输出字符串格式而且pickle输出的格式只有python可以loads(),json是跨语言的。
dic1 = {'k1':'v1', 'k2':'v2'}
r1 = pickle.dumps(dic1)
print(r1, type(r1))
dic2 = pickle.loads(r1)
print(dic2, type(dic2))
程序执行结果
b'\x80\x03}q\x00(X\x02\x00\x00\x00k2q\x01X\x02\x00\x00\x00v2q\x02X\x02\x00\x00\x00k1q\x03X\x02\x00\x00\x00v1q\x04u.' <class 'bytes'>
{'k1': 'v1', 'k2': 'v2'} <class 'dict'>
另一个区别在于pickle可以用于任何数据类型的序列化而json只能用于基本数据类型比如下面这段代码就会报错,因为json不能对"对象”序列化
class foo:
def __init__(self):
pass
obj1 = foo()
r2 = json.dumps(obj1)
print(r2)
报错如下
TypeError: <__main__.foo object at 0x01EC2E50> is not JSON serializable

(2)dump()load()方法
和json一样pickle也有dump()和load()方法但是在open文件时需要指定二进制方法
class foo:
def __init__(self):
pass
obj1 = foo()
pickle.dump(obj1, open('temp', 'wb'))
r3 = pickle.load(open('temp','rb'))
print(r3, type(r3))
程序执行结果
<__main__.foo object at 0x024B8430> <class '__main__.foo'>
dump()写入的temp文件内容如下
?c__main__
foo
q )?q.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pickle dump load