第七章:数据持久存储与交换-pickle:对象串行化-编码和解码字符串中的数据

第七章 数据持久存储与交换
7.1 pickle:对象串行化
pickle模块实现了一个算法可以将一个任意的Python对象转换为一系列字节。这个过程也被称为串行化对象。可以传输或存储表示对象的字节流,然后再重新构造来创建有相同性质的新对象。
警告:pickle的文档明确指出它不提供任何安全保证。实际上,对数据解除腌制可以执行任意的代码。使用pickle完成进程间通信或数据存储时要当心,另外不要相信未经过安全验证的数据。参见hmac模块,其中有一个例子展示了验证腌制数据源来源的一种安全方法。
7.1.1 编码和解码字符串中的数据
第一个例子使用dumps()将一个数据结构编码为一个字符串,然后把这个字符串打印到控制台。它使用了一个完全由内置类型构成的数据结构。任何类的实例都可以腌制,如后面的例子所示。

import pickle
import pprint

data = [{'a':'A','b':2,'c':3.0}]
print('DATA:',end=' ')
pprint.pprint(data)

data_string = pickle.dumps(data)
print('PICKLE: {!r}'.format(data_string))

默认地,pickle将以一种二进制格式写入,在Pyton3程序之间共享时这种格式兼容性最好。
运行结果:
在这里插入图片描述
数据串行化后,可以写到一个文件、套接字、管道或者其他位置。之后可以读取这个文件,将数据解除腌制,以便用同样的值构造一个新对象。

import pickle
import pprint

data1 = [{'a':'A','b':2,'c':3.0}]
print('BEFORE: ',end=' ')
pprint.pprint(data1)

data1_string = pickle.dumps(data1)

data2 = pickle.loads(data1_string)
print('AFTER : ',end=' ')
pprint.pprint(data2)

print('SAME? :',(data1 is data2))
print('EQUAL?:',(data1 == data2))

新构造的对象等于原来的对象,但并不是同一个对象。
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43193719/article/details/88773390
今日推荐