Python的pickle模块详解(包括优缺点及和JSON的区别)

2023-11-16

一、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 pickle

a = {'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的支持!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python的pickle模块详解(包括优缺点及和JSON的区别) 的相关文章

随机推荐

  • 联盟链战国:五大巨头横向对比

    联盟链是目前区块链落地实践的热点 也是大家对 杀手级应用 期望最大的区块链部署形态 联盟链的诞生源于对区块链技术的 反思 是对比特币 以太坊所体现的技术特点与企业客户实际需要的融合与折衷 蕴含了大量区块链工作者的智慧与辛劳 由于对未来价值的
  • Node.js

    修改软件安装的路径 此电脑右击 属性 高级系统设置 环境变量 选中path 编辑 修改路径 确定 定义区别 一 浏览器中的JS 1 浏览器中的JS组成 JS核心语法 ECMAScript 和 WebAPI 浏览器内置的API 2 为什么Ja
  • 在cms以及kindeditor中插入百度动态地图的方法

    想在网页中插入动态地图不难 直接打开网址http api map baidu com lbsapi creatmap 然后按照提示操作 最终生成脚本 放到html文件中即可 而在kindeditor中插入动态地图就更简单了 最新版的kind
  • 部分和问题(c/c++)

    给定整数a1 a2 a3 an 判断是否可以从中 选出若干输使得它们的和恰好为k 第一行输入n代表几个数字 第二行输入数字 第三行输入结果 样例 4 1 2 4 7 13 yes 这是一道基础题 对于初学者而言使用两重循环无疑是最便捷的 i
  • 路由器与交换机的基本工作原理

    本文介绍路由器与交换机的基本工作原理 在介绍这之前先来看一下OSI七层工作模型 现在开始解释路由器的作用及其基本工作原理 路由器的作用 1 异种网络互连 比如具有异种子网协议的网络互连 2 子网协议转换 不同子网间包括局域网和广域网之间的协
  • 论文排版:Word加入脚注后,分栏的正文就跑到下一页上去了的解决方案

    在论文排版中 在题目或作者处插入了脚注后 再对正文分栏时 或者先分栏 再在题目或作者处插入脚注 分栏后的正文就跑到下一页上去了 这个问题 我抓狂了很久 终于在搜索若干关键字后得以解决 情况一 稿件格式的要求 1 题目和摘要部分不分栏 正文部
  • 【架构】1.2浅谈架构基础-架构设计的目的

    架构设计的目的 架构设计的目的 软件发展历程 如何识别软件的复杂度 高性能 高可用 可扩展 成本价值 安全因素 架构设计的目的 谈及架构设计 应该IT从业者都很经常听到 然而对于架构设计的目的 可能每个人都有自己的理解 例如 因为现在的系统
  • 毕业设计 opencv图像增强算法系统

    文章目录 0 简介 1 基于直方图均衡化的图像增强 2 基于拉普拉斯算子的图像增强 4 基于伽马变换的图像增强 软件实现效果 最后 0 简介 今天学长向大家分享一个毕业设计项目 毕业设计 opencv图像增强算法系统 项目运行效果 毕业设计
  • 8个不可不知的Mac OS X专用命令行工具

    本文转载至 https segmentfault com a 1190000000509514 OS X的终端下通用很多Unix的工具和脚本 如果从Linux迁移到OS X会发现很多熟悉的命令和脚本工具 其实并没有任何区别 但是OS X也提
  • Clamav杀毒软件源码分析笔记[十]

    Clamav杀毒软件源码分析笔记 十 刺猬 http blog csdn net littlehedgehog 客户端处理 服务端已经把主要的工作都已经处理的差不多了 剩下来也就是服务端等待客户端提出请求 然后根据客户端的请求做相应的工作
  • sql注入绕过技巧

    前言 今天斗胆来整理一下sql注入的各种绕过姿势 以后方便查阅 SQL注入的绕过技巧有很多 具体的绕过技巧需要看具体的环境 而且很多的绕过方法需要有一个实际的环境 最好是你在渗透测试的过程中遇到的环境 否则如果仅仅是自己凭空想 那显然是不靠
  • C语言项目——学生信息管理系统

    文章目录 学生信息管理系统 一 项目思路 1 模块化思想 2 流程图 二 功能框架 1 系统菜单 2 其他功能 三 分布实现 0 学生属性 系统属性 1 学生属性 2 系统属性 1 创建系统 2 绘制菜单 3 按键操作 4 录入信息 5 浏
  • 等精度测频原理--频率计

    等精度测频原理 频率计 本系统采用等精度测频的原理来测量频率 其原理如图2所示 图2 等精度测频原理图 图2中的门控信号是可预置的宽度为Tpr的一个脉冲 CNT1和CNT2是两个可控计数器 标准频率信号从CNT1的时钟输入端FS输入 其频率
  • 常见的几种矩阵分解方式

    项目github地址 bitcarmanlee easy algorithm interview and practice 欢迎大家star 留言 一起学习进步 1 三角分解 LU分解 矩阵的LU分解是将一个矩阵分解为一个下三角矩阵与上三角
  • H5浏览器播放RTMP直播流

  • Python编程快速上手

    题目1 编写一个名为collatz 的函数 它有一个名为number的参数 如果参数是偶数 那么collatz 就打印出number 2 如果number是奇数 collatz 就打印3 number 1 def collatz numbe
  • 面试题 ⑥

    1 Java常见的线程池有哪些 它们的使用场景 newSingleThreadExecutor 创建一个单线程的线程池 此线程池保证所有的执行顺序按照任务的提交顺序执行 FIFO 适合顺序处理文件日志等 newFixedThreadPool
  • easyUI datagrid中checkbox选中事件以及行点击事件,翻页之后还可以选中

    DataGrid其中与选择 勾选相关 DataGrid属性 singleSelect boolean 如果为true 则只允许选择一行 false ctrlSelect boolean 在启用多行选择的时候允许使用Ctrl键 鼠标点击的方式
  • MySQL主从复制(Master-Slave)实践

    转载自 https www cnblogs com gl developer p 6170423 html 参考 https blog csdn net lildkdkdkjf article details 10004663 MySQL数
  • Python的pickle模块详解(包括优缺点及和JSON的区别)

    文章目录 一 pickle是什么 1 pickle的优缺点 2 pickle和JSON的区别 3 pickle的应用总结 二 pickle的用法 1 pickle接口 2 pickle实例 结语 一 pickle是什么 在英语中 pickl