Python标准库之pickle

news2025/1/19 8:01:30

1. pickle标准库简介

  • pickle,作为名词表示泡菜,作为动词表示用醋或盐水保存食物。由此不难联想到,用存储设备持久化保存数据。而pickle标准库恰是一个 Python 对象结构的二进制序列化和反序列化的核心库,专用于表示Python语言大量数据类型,是序列化 Python 对象时的首选。
  • pickle标准库是一个纯Python实现的标准版本,cPickle标准库(Python 3.x更名为_pickle)则是C语言实现的加速版本,读写效率较高。
  • 实际使用Python3.x过程中,我们直接导入标准版本即可,源代码最后部分会尝试导入加速版本对应函数,不必单独导入pickle模块,如下所示:
# Use the faster _pickle if possible
try:
    from _pickle import (
        PickleError,
        PicklingError,
        UnpicklingError,
        Pickler,
        Unpickler,
        dump,
        dumps,
        load,
        loads
    )
except ImportError:
    Pickler, Unpickler = _Pickler, _Unpickler
    dump, dumps, load, loads = _dump, _dumps, _load, _loads

1.1 预备知识

  • 数据持久化(Data Persistence):将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称,一般是指把瞬时数据(如内存中的对象)转换为持久数据永久保存到存储设备中(如磁盘)。

  • 序列化\反序列化分类:二进制序列、文本序列

  • 序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程,目的是使内存中的状态信息持久化便于以后恢复、

    方便在网络传输以实现跨平台数据交互。

  • 反序列化(Deserialization):将序列重新恢复成对象的过程,是序列化的逆过程

1.2 pickle与json的对比

比较维度\标准库picklejson
序列化方式二进制序列文本序列
人类直观可读
跨平台、语言、协议否,Python专用
数据类型表示支持可表示大量Python数据类型只能表示Python内置类型子集,不能表示自定义的类

2. pickle常用函数

2.1 pickle.dump(obj, file, protocol=None, *, fix_imports=True)

将 Python 对象写入已打开的二进制文件

# define a dict object
obj={
    "name":"Bonnie",
    "isAGirl":True,
    "age":22,
    "hobbies":["guitar","singing","traveling"]
}
# 将obj写入已打开的二进制文件,序列化
with open("puppy_love.pkl","wb") as f:
    pickle.dump(obj,f,protocol=pickle.HIGHEST_PROTOCOL) # 设置为可用的最高协议

在这里插入图片描述

2.2 pickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict')

从已打开的二进制文件中读取打包后的对象,重建其中特定对象的层次结构并返回

# 从打开的二进制文件重建对象,反序列化
with open("puppy_love.pkl","rb") as f:
    obj_again=pickle.load(f)
print("反序列化后的对象为{}".format(obj_again))

在这里插入图片描述

2.3 pickle.dumps(obj, protocol=None, *, fix_imports=True)

将 obj 打包以后的对象作为bytes 类型直接返回,而不是将其写入到文件

# 将Python对象直接转为bytes类型,不写入文件
bytes_obj=pickle.dumps(obj,protocol=pickle.HIGHEST_PROTOCOL) # 设置为可用的最高协议
print("obj转换为bytes类型后为{}".format(bytes_obj))

在这里插入图片描述

2.4 pickle.loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')

重建并返回一个对象的封存表示形式 data 的对象层级结构,bytes类型将反序列化为Python对象

# bytes类型将反序列化为Python对象
obj_origin=pickle.loads(bytes_obj)
print("bytes类型将反序列化为obj后{}".format(obj_origin))

在这里插入图片描述

3.参考文献

  • pickle —— Python 对象序列化 — Python 3.7.13 文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stable Diffusion7

它也写到第七部了.. Stability AI宣布,Stable Diffusion 2.0版本上线!1.0版本在今年8月出炉,三个月不到,还热乎着呢,新版本就来了。 深度学习文本到图像模型的最新版本——Stable Diffusion 2.0。相较于1.0&#xff…

面试必知的9个性能测试指标,你完全了解吗?

吞吐量 单位时间内,系统能够处理多少请求,吞吐量代表网络的流量,TPS越高,吞吐量越大,还包含了数据的吞吐量。一般单位为秒,每秒处理的请求量。 注意:我们看到的JMeter聚合报告一般如下图&…

Kotlin高仿微信-第7篇-主页-动态权限申请

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

指定牛导|肿瘤专业医生芝加哥大学博士后实现夙愿

Q医生有个愿望,希望拜师在牛导麾下,利用国家留学基金委2年博士后的机会,真正做出科研成果,发表高质量文章。为此列出了合作导师标准并指定了几位教授。经过团队努力,我们终于为其达成夙愿—获得指定牛导的博士后邀请函…

Redis实战之缓存:查询、添加缓存、更新缓存、缓存预热、缓存穿透、缓存雪崩、缓存击穿 解决方案及实例代码

缓存 什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 为什么要使用缓存? 缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器…

SpringBoot利用Spring SPI机制实现自动按顺序加载注册JavaBean到容器中

前言: 1、SPI机制(Service Provider Interface),服务提供接口,主要是用来解耦,资源文件目录下的 \resources\META-INF\spring.factories 我们把它归纳为Spring为我们提供的SPI机制,通过这种机制,我们可以在…

docker 容器原理分析笔记(下)

目录 chroot rootfs Volume(数据卷) 打包一个go镜像 总结 chroot 当一个容器被创建的时候,我们希望容器中进程看到的文件是一个独立的隔离环境,我们可以在容器进程重启之前挂载整个根目录 /,由于 Mount Namespace 的存在,这…

发布 .NET MAUI / MAUI Blazor 应用 (1) - Windows

发布用于Windows的 .NET MAUI 应用 打开 PowerShell 终端 , 命令行进入工程目录,以我的例子工程为例, cd BlazorMaui BlazorMaui 替换为你自己工程名字 New-SelfSignedCertificate -Type Custom -Subject "CNBlazorMaui" -KeyUsage DigitalSignature -FriendlyName &…

python如何将日期字符串格式化年月日

今天用Python的DataFrame处理数据时,相对一波数据按日期分组处理,但是原始数据包含时间分秒,无法按日期分组,因此需要先将数据转成只包含年月日的数据格式。但是写代码处理过程中发现有点绕,不熟悉的同学容易绕晕。这种…

编程语言如何推动DeFi成为主流?

随着DeFi的快速增长,提供DeFi服务的平台和产品也如雨后春笋般纷纷冒头。作为衡量DeFi协议管理资金规模的标准之一,DeFi“总锁仓量”在过去两年一路从100亿美元增长到超400亿美元,期间更是一度冲上1800亿美元的巅峰。但直到今天,智…

Python爬虫request模块的get、post方法应用

目录 post方法使用 一、确定爬取网站的数据 二、分析数据类型和相应类型 三、使用requetst模块方法进行爬取 四、源代码分享 get的方法使用 一、分析抓取网站操作 二、参数的分析和组成 三、使用get模块方法进行爬取结果 四、源代码分享 思考和总结 参考网站 爬虫是…

MySQL---触发器详解

目录 一、触发器的介绍 二、触发器的语法 (1)insert触发器 (2)update触发器 (3)delete触发器 一、触发器的介绍 触发器是与表有关的数据库对象,指在insert/update/delete 之前或之后&…

4-UI自动化-selenium三大等待操作

4-UI自动化-selenium三大等待方式selenium三大等待方式强制等待timd.sleep隐式等待implicitly_wait显式等待WebDriverWait显式等待和隐式等待的区别上篇介绍了3-UI自动化-八大元素定位,xpath定位方式和相关的常问面试题 本篇来学习三大等待方式 ♡\color{red}{\hear…

如何用蓝牙实现无线定位(一)--系统原理

1. 简介 本项目将利用多个BLE4.0蓝牙模块,配合主控板、OLED显示屏等,构建一个无线定位系统。 本项目的系统构成为:3个信号塔,1个中控台,2个被定位的目标。 无线定位的用途有很多。比如,我们可以把固定的目…

zabbix拓扑图和聚合图形

目录 一、环境准备 1、搭建zabbix基础环境 2、创建被监控主机 二、拓扑图 1、拓扑图作用 2、拓扑图绘制步骤 三、聚合图形 1、聚合图形的作用 2、创建聚合图形 一、环境准备 1、搭建zabbix基础环境 zabbix基础环境部署参照:zabbix基础环境部署_桂安俊kyli…

方格取数 (两条路径,使得取得的数字和为最大)

设有 NN 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。 在走过的路上&#xff0…

Vue中的组件生命周期

一个组件从创建到销毁的过程 成为生命周期。 在我们使用Vue3 组合式API 是没有 beforeCreate 和 created 这两个生命周期的 组件生命周期如下: onBeforeMount() 在组件DOM实际渲染安装之前调用。在这一步中,根元素还不存在。onMounted() 在组件的第一次…

【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

1、网关流控介绍 在微服务系统中,网关提供了微服务系统的统一入口,所以在做限流的时候,肯定是要在网关层面做一个流量的控制,Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入…

R语言隐马尔可夫模型HMM识别不断变化的市场条件

了解不同的市场状况如何影响您的策略表现可能会对您的收益产生巨大的影响。最近我们被客户要求撰写关于隐马尔可夫模型的研究报告,包括一些图形和统计输出。 某些策略在波动剧烈的市场中表现良好,而其他策略则需要强劲而平稳的趋势,否则将面…

【PdgCntEditor】解决PDF的目录页码和PDF实际页码不一致的问题,书签页码偏移页面偏移功能,PDF页面标签的添加

一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码,两者之间存在一定的偏移值;导致我们看目录后面的页码,并不能直接借此数字索引到对应页面,非常麻烦。 二、改变页码标签 这是第一种方法&…