Python的pickle模块详解(包括优缺点及和JSON的区别)
文章目录
- 一、pickle是什么?
- 1.pickle的优缺点
- 2.pickle和JSON的区别
- 3.pickle的应用总结
- 二、pickle的用法
- 1. pickle接口
- 2. pickle实例
- 结语
一、pickle是什么?
在英语中 pickle 名词是泡菜,动词是腌渍的意思。可以理解为把东西腌起来保存成文件,要用的时候读出来洗洗再用。
python的pickle模块实现了基本的数据序列化和反序列化。
序列化对象可以在磁盘上保存对象,并在需要的时候读取出来。任何对象都可以执行序列化操作。
pickling是将Python对象层次结构转换为字节流的过程。
unpickling是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。
1.pickle的优缺点
1、优点:
pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化。
没有外部标准强加的限制,例如JSON或XDR(不能代表指针共享)。
默认情况下,pickle数据格式使用相对紧凑的二进制表示。如果需要最佳尺寸特征,则可以有效地压缩数据。
pickle可以表示极其庞大的Python类型(其中许多是自动的,通过巧妙地使用Python的内省工具;复杂的案例可以通过实现特定的对象API来解决)。
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
2、缺点:
pickle模块只能在python中使用,仅限于传输的两端都是python的情况,且需要尽量保持两端的版本一致。
非Python程序可能无法重建pickled Python对象。
pickle序列化后的数据,可读性差,人一般无法识别。
2.pickle和JSON的区别
1、JSON是一种文本序列化格式(它输出unicode文本,虽然大部分时间它被编码utf-8),而pickle是二进制序列化格式。
2、JSON是人类可读的,而pickle则不是。
3、JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的。
默认情况下,JSON只能表示Python内置类型的子集,而不能表示自定义类;
JSON和JSON模块详解
3.pickle的应用总结
本地序列化的情况,应用较少。一般来说,大多数应用场景在网络中,将数据序列化后通过网络传输到远程结点,远程服务器上的服务接受到数据后进行反序列化,就可以使用了。
但是,需要注意的是,远端接受端反序列化时必须有对应的数据类型,否则就会报错,尤其是自定义类,必须远程存在。
目前,大多数项目都不是单机,不是单服务,需要通过网络将数据传送到其他结点上,这就需要大量的序列化,反序列化。
但是python程序之间还可以使用pickle解决序列化和反序列化。
如果是跨平台,跨语言,跨协议,pickle就不适合了,就需要公共协议,如XML/Json /protocol Buffer等。
每种协议都有自己的负载,其所使用的场景都不一样,二进制的操作不一定适用于所有的场景。
但越是底层的协议,越需要二进制传输。
二、pickle的用法
1. pickle接口
pickle 包主要提供了两个功能,一个是将对象转换成字节流,即串行化;另一个是将字节流转换成对象,即反串行化。
每个功能又分出了两个分支,一个是仅转换成字节流,另一个是转换成字节流并保存到文件中去。
所以 pickle 包主要有 4 个接口,如下图所示:
基本接口:
pickle.dump(obj, file [,protocol])
注释:
obj——序列化对象,将对象obj保存到文件file中去。
file——file表示保存到的类文件对象,file必须有write()接口,file可以是一个以’w’打开的文件或者是一个StringIO对象,也可以是任何可以实现write()接口的对象。
protocol——序列化模式,默认是 0(ASCII协议,表示以文本的形式进行序列化)。
protocol的值还可以是1和2(1和2表示以二进制的形式进行序列化。其中,1是老式的二进制协议;2是新二进制协议)。
1、dump(对象,文件对象):串行化并保存到文件,dump 的文件对象要求是可写的。
2、load(文件对象):从文件读数据并恢复出对象。load 函数从文件对象中读出一个对象,返回值就是该对象。
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> fd = open("tmp,bin", "wb")
>>> fd
<open file 'tmp,bin', mode 'wb' at 0x000000000277E8A0>
>>> pickle.dump(a, fd)
>>> fd.close()
>>> fd2 = open("tmp,bin", "rb")
>>> a2 = pickle.load(fd2)
>>> a2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3、dumps(对象):仅串行化。dumps 函数返回一个字节流。
4、loads(字节流):从字节流中恢复出对象。输入应该是 dumps() 的返回值。
注意,不要随意构造字节流,因为并不是所有的字节流都能被解析出来。
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s = pickle.dumps(a)
>>> s
'(lp0\nI0\naI1\naI2\naI3\naI4\naI5\naI6\naI7\naI8\naI9\na.'
>>> type(s)
<type 'str'>
>>> b = pickle.loads(s)
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2. pickle实例
有了 pickle 这个对象, 就能对 file 以读取的形式打开:
x = pickle.load(file)
注解:从 file 中读取一个字符串,并将它重构为原来的python对象。
序列化的时候,只是序列化了整个序列对象,而不是内存地址。
file:类文件对象,有read()和readline()接口。
举例:
一个字典a = {‘name’:‘Tom’,‘age’:18},用pickle.dump存到本地文件,所存数据的结构就是字典。
而普通的file.write写入文件的是字符串。读取时,pickle.load返回的是一个字典,file.read返回的是一个字符串。
如下代码:
import picklea = {'name': 'Tom', 'age': 18}
with open('text.txt', 'wb') as file:pickle.dump(a, file)
with open('text.txt', 'rb') as file2:b = pickle.load(file2)
print(type(b))
运行结果:
得到的b的类型是字典,b和a是等价的。
也就是说pickle可以把字典、列表等结构化数据存到本地文件,读取后返回的还是字典、列表等结构化数据。
而file.write、file.read存取的对象是字符串。
我们再使用zip创建字典看看反序列化输出是不是也是字典:
zip()可以将两个可迭代对象中的对应元素打包成一个个元组,然后返回这些元组组成的列表。
dict()创建字典,可以传入元组列表创建字典,也可以通过zip得到元组列表后来创建字典。
from pickle import *d = dict(zip('mysql', range(5)))
s = dumps(d) # 进行序列化
print(s) # 正常情况的输出
print(loads(s)) # 进行反序列化并输出
运行结果如下,结果也是字典:
结语
以上就是Python的pickle模块详解的全部内容啦!希望对大家有所帮助。 如果大家有任何疑问请给我留言,我会尽快回复大家。在此也非常感谢大家对CSDN的支持!
Python的pickle模块详解(包括优缺点及和JSON的区别)相关推荐
- python之sys模块详解_(转)python之os,sys模块详解
python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...
- 【Python】python之subprocess模块详解
[Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...
- python当中时间模块详解,包括time,timeit,datatime
目录 time 模块 -- 时间获取和转换 以下三个比较常见: time.perf_counter() time.process_time() time.sleep(secs) timeit 模块详解 ...
- python中logging模块详解_python logging日志模块详解
logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...
- Python的PyYAML模块详解
文章目录 注:原文链接 简介 安装 简单安装 从源码安装 最常被问到的问题 使用详解 加载YAML 转储YAML 构造.表示和解析 YAML语法 文档 块序列 块映射 流集合 标量 别名 标签 YAM ...
- python re正则模块详解
一. 正则表达式 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子 ...
- python之re模块详解
re模块 功能:用来匹配字符串(动态.模糊的匹配),爬虫用的多. 一.常用方法: match():从头匹配 search():从整个文本搜索 findall():找到所有符合的 split():分割 ...
- Python中hashlib模块详解
文章目录 一.hashlib的简介 二.hashlib的使用 1.常用属性 2.常用方法 3.使用示例 三.hashlib的特点 四.代码实操 1.举例子 2.应用场景案例 一.hashlib的简介 ...
- Python中time模块详解
转载自:http://qinxuye.me/article/details-about-time-module-in-python/ 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间 ...
最新文章
- 日本推出透明公厕,智能玻璃控制透明度,有人如厕就“屏蔽”外界
- omnigraffle怎么画曲线
- 第四范式入选Forrester中国机器学习Now Tech™,成唯一AutoML专注类大型厂商
- WPF企业内训全程实录(下)
- [渝粤教育] 南京信息职业技术学院 电工电子技术基础 参考 资料
- 【Modern OpenGL】Shader
- Qt工作笔记-UDP多线程数据处理及发送(简单实例)
- 浅谈网站流量构成比例
- 做一个项目,平时都用到哪些工具提高效率(中)
- SPOJ 4487 Can you answer these queries VI
- Java Web学习总结(12)——使用Session防止表单重复提交
- volley6--CacheDispatcher从缓存中获取数据
- 微信公众号如何上传文档附件_公众号添加Excel、PDF、PPT等附件教程
- 【OpenGL】斯坦福兔子、显示列表
- v4l2loopback -- 源码分析
- 修改远程计算机 时间,Pubwin服务器时间修改的四种办法
- USACO--3.2Feed Ratios
- RIP --- 路由信息协议
- python输入一个自然数n如果n为奇数_日本数学家谷角静夫在研究自然数时发现了一个奇怪现象(“谷角猜想”):对于任意一个自然数...
- win7修复计算机消失,win7系统引导文件丢失的修复妙招
热门文章
- Ant Design学习——Slider
- Photoshop_CS6永久验证的方法
- 入门以后如何深入学习 C++ ?有哪些建议?
- MediaPlayer 音乐播放器进度条
- ES全文检索详细教程
- 《毒液》:用Fiddler+MongoDB抓取猫眼APP短评
- /lib64/libc.so.6: version GLIBC_2.14 not found
- SpringBoot使用JPA多表关联动态查询指定字段
- On the difficulty of training Recurrent Neural Networks
- 如何在博客文章中使用表情符号?