当前位置: 首页 > news >正文

Python对象序列化

888e5dc27c22e78b86b72a7544280e53.png

迷途小书童的 Note

读完需要

7

分钟

速读仅需 3 分钟

大家好,我是迷途小书童!

在 Python 开发中,我们经常需要将对象数据保存到磁盘,或者通过网络传输对象信息。这时就需要序列化,Pickle 库为我们提供了极为方便的对象序列化功能。本文将全面解析 Pickle 的工作机制、典型应用及示例代码,希望可以帮助初学者快速掌握这个实用的内置模块。

1

   

简介

pickle 模块实现了对一个 Python 对象结构的二进制序列化和反序列化。pickling 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 unpickling 是相反的操作,会将字节流转化回一个对象层次结构。

Python 中几乎所有的数据类型(列表,字典,集合,类等)都可以用 pickle 来序列化。

2

   

常用方法

pickle 模块提供了以下方法,让序列化和反序列化的过程更加方便

  • dump 方法

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

    将对象 obj 序列化以后的对象写入已打开的文件对象中。参数 protocol 是序列化模式,默认值为 0,表示以文本的形式序列化。protocol 的值还可以是 1 或 2,表示以二进制的形式序列化。

  • dumps 方法

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

    将 obj 封存以后的对象作为 bytes 类型直接返回,而不是将其写入到文件对象中。各参数与 dump 中的一样。

  • load 方法

  • pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

    从已打开文件对象中读取序列化后的对象,重建其中特定对象的层次结构并返回。

    pickle 协议版本是自动检测出来的,所以不需要参数来指定协议。封存对象以外的其他字节将被忽略。

  • loads 方法

  • pickle.loads(data, /, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

    重建并返回 data 的对象层级结构。data 是序列化后的 bytes 对象。

3

   

示例代码

首先,来看看序列化的过程,分别将字符串、字典和列表进行序列化,使用 dump 方法

(demo) PS C:\Users\Administrator> ipython
Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.12.0 -- An enhanced Interactive Python. Type '?' for help.In [1]: aString = 'xugaoxiang.com'In [2]: aDict = {'p': 'python', 'r': 'rust', 's': 'swift'}In [3]: aList = ['one', 'two', 'three']In [5]: f = open('test.pkl', 'wb')In [6]: pickle.dump(aString, f, True)
<IPython.core.display.Javascript object>In [7]: pickle.dump(aDict, f, True)
<IPython.core.display.Javascript object>In [8]: pickle.dump(aList, f, True)
<IPython.core.display.Javascript object>In [9]: f.close()In [10]:

这时候,在目录 C:\Users\Administrator 就生成了二进制文件 test.pkl

960509c8439eeba215032fc14a3e15de.png

接下来开始反序列化

In [11]: f = open('test.pkl', 'wb')In [12]: pickle.dump(aString, f, True)
<IPython.core.display.Javascript object>In [13]: pickle.dump(aDict, f, True)
<IPython.core.display.Javascript object>In [14]: pickle.dump(aList, f, True)
<IPython.core.display.Javascript object>In [15]: f.close()In [16]: f1 = open('test.pkl', 'rb')In [17]: lString = pickle.load(f1)
<IPython.core.display.Javascript object>In [18]: lString
Out[18]: 'xugaoxiang.com'In [19]: lDict = pickle.load(f1)
<IPython.core.display.Javascript object>In [20]: lDict
Out[20]: {'p': 'python', 'r': 'rust', 's': 'swift'}In [21]: lList = pickle.load(f1)
<IPython.core.display.Javascript object>In [22]: lList
Out[22]: ['one', 'two', 'three']In [23]: f1.close()

通过以上代码,可以看到反序列化的过程跟序列化的顺序一样,这一点跟数据结构中的队列很像。

4

   

文件对象不可以序列化

python 不能序列化文件对象,或者任何带有对文件对象引用的对象,因为在反序列化时无法保证它可以重建该文件的状态。看下面的示例

In [32]: f = open('test.pkl', 'wb')<IPython.core.display.Javascript object>
In [33]: p = pickle.dumps(f)
<IPython.core.display.Javascript object>
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-671076828a70> in <module>
----> 1 p = pickle.dumps(f)TypeError: cannot serialize '_io.BufferedWriter' objectIn [34]:

5

   

可移植性

pickle 文件格式独立于机器的体系结构,这也就意味着,可以在 linux 下创建一个 pickle,然后将它发送到在 Windows 或 MacOS 下运行的 Python 程序。而且,当 python 版本升级时,也不必担心已有的 pickle 操作出现问题,可以向后兼容。

6

   

免费社群

66165f2f5b0a6a012818aaf9110d1940.jpeg

相关文章:

Python对象序列化

迷途小书童的 Note 读完需要 7分钟 速读仅需 3 分钟 大家好&#xff0c;我是迷途小书童&#xff01; 在 Python 开发中&#xff0c;我们经常需要将对象数据保存到磁盘&#xff0c;或者通过网络传输对象信息。这时就需要序列化&#xff0c;Pickle 库为我们提供了极为方便的对象序…...

jmeter 准确的吞吐量定时器 Precise Throughput Timer

准确的吞吐量定时器使用实例 提取码&#xff1a;gpex&#xff1a; 说明&#xff1a;配置10个线程&#xff0c;每个线程请求200次&#xff0c;通过准确地的定时器模拟QPS为20的场景 配置测试接口参考链接 配置jmeter测试脚本&#xff0c;主要关注准确的吞吐量定时器参数配置 目…...

后端/DFT/ATPG/PCB/SignOff设计常用工具/操作/流程及一些文件类型

目录 1.PD/DFT常用工具及流程 1.1 FC和ICC2 1.2 LC (Library compiler) 1.3 PrimeTime 1.4 Redhawk与PA 1.5 Calibre和物理验证PV 1.6 芯片设计流程 2.后端、DFT、ATPG的一些常见文件 2.1 LEF和DEF 2.2 ATPG的CTL和STIL 2.3 BSDL 2.4 IPXCT 3.PCB设计的一些工作和工…...

jvm 程序计算器 程序计数器是否溢出 程序计数器是做什么的 java程序计数器会内存溢出吗 程序计数器作用与用处 jvm内存模型 jvm合集(一)

1. jvm内存模型&#xff1a; 内存模型&#xff1a; 程序计数器 堆 栈 本地方法栈 方法区 2. java代码编译为class文件&#xff0c;由类加载器加载到jvm&#xff0c;然后由解释器,jit即时编译到机器码&#xff0c;机器码再到cpu执行 3. 程序计数器&#xff1a; 是一块较小的内存…...

关于近期小程序测试的常见漏洞演示

本章节将为大家介绍一下小程序常见的漏洞的展示案例&#xff0c;包括支付业务逻辑漏洞、任意用户登录漏洞、水平越权漏洞等高危漏洞。 以上小程序测试均获取授权&#xff0c;并且客户均已得到修复(仅供学习&#xff0c;请勿恶意攻击)​ 关于微信小程序如何拦截数据包&#xff…...

磐基2.0部署apisix集群

一、部署etcd集群 由于etcd是磐基2.0的组件服务&#xff0c;直接通过组件部署即可。如需手动部署&#xff0c;参考如下链接 k8s 部署etcd集群_k8s部署etcd_平凡似水的人生的博客-CSDN博客前言公司计划使用etcd来做统一配置管理&#xff0c;由于服务都在阿里云托管k8s集群上&a…...

Python requests爬虫豆瓣图片返回数据为空。

爬个豆瓣图片&#xff0c;记录个小问题&#xff0c;发现爬取豆瓣原图的时候拿不到数据&#xff0c;返回为空&#xff0c;爬小图可以&#xff0c;爬其他网站的也都正常&#xff0c;最后发现是header中If-Modified-Since这个参数的原因&#xff0c;加上了就拿不到数据&#xff0c…...

【Spring事务的实现原理】

Spring事务的实现原理就是通过拦截Transactional注解标识的方法&#xff0c;使用事务增强器对这些方法进行事务管理。其中关键的是事务管理器和事务属性源的配置和使用。Spring事务的实现原理可以简单理解为以下几个步骤&#xff1a; 从配置文件中获取PlatformTransactionManag…...

摆动输入连杆夹持机构

1、运动与受力分析 import sympy as sy import numpy as np import matplotlib.pyplot as plt a,a1,b,b1,c,c1,d2,d3,fi,F,L,e sy.symbols(a,a1,b,b1,c,c1,d2,d3,fi,F,L,e)A(-d2,0) D(0,d3) B(-d2a*cos(fi),a*sin(fi)) C(-c*cos(pu),d3c*sin(pu)) B(-d2a*cos(fipi),a*sin(fipi…...

C++——类与对象(下篇)

前言 前面已经介绍了类与对象&#xff08;上&#xff09;&#xff0c;类与对象&#xff08;中&#xff09;的两篇文章&#xff0c;下面是类与对象的最后一些重要知识点的介绍和总结。 目录 再谈构造函数Static成员友元内部类匿名对象拷贝对象时的一些编译器优化再次理解封装…...

stm32 freeRTOS lwip TCP快速发送,内存泄露问题

现象1&#xff1a; 发送缓慢&#xff0c;tcp_write之后要等200多ms才能过发送出去&#xff0c;而且粘包严重。 解决办法 tcp_write之后&#xff0c;立马调用tcp_output &#xff0c;tcp就会立马发送。 tcp_write tcp_output 现象2&#xff1a; 持续快速发送和接受TCP数据出…...

Ei、Scopus双检索 | 2024年第三届人工智能与机器学习前沿国际会议(FAIML 2024)

会议简介 Brief Introduction 2024年第三届人工智能与机器学习前沿国际会议(FAIML 2024) 会议时间&#xff1a;2024年4月26日-28日 召开地点&#xff1a;中国宜昌 大会官网&#xff1a;www.faiml.org FAIML 2024将围绕“人工智能与机器学习”的最新研究领域而展开&#xff0c;为…...

win10环境下搭建QT+opencv

安装步骤 源码编译安装免编译/cmake安装vs2022环境安装 问题解决 modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1 PS D:\Qt\Tools\mingw730_64\bin> D:\Qt\Tools\mingw730_64\bin\windres.exe D:\Opencv\opencv\opencv\build\modules\core\vs_ver…...

React16、18 使用 Redux

Redux 核心 Redux 介绍 Redux 是javaScript 状态容器&#xff0c;提供可预测化的状态管理 Redux 工作流程 Actions&#xff1a;对象&#xff0c;描述对状态进行怎样的操作 Reducer&#xff1a;函数&#xff0c;操作状态并返回新的状态 Store&#xff1a;存储状态的容器&am…...

【Python】Python运算符/部分函数对应的双下划线魔法方法

先说下Python版本&#xff1a;【Python 3.7.8】 以下用图片表格展示&#xff0c;一是防扒&#xff0c;二是没精力改成md格式。 还有就是内容肯定没有完全包含(而且也很难做到)&#xff0c;像是__reduce__与py自带模块pickle有关(pickle用于对象序列化/反序列化)、sys.getsizeo…...

Macs Fan Control 1.5.16 Pro for mac风扇调节软件

Macs Fan Control是一款专门为 Mac 用户设计的软件&#xff0c;它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度&#xff0c;以提高设备的散热效果&#xff0c;减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温度和…...

某技术公司技术二面面试题总结

存在一个单体架构的服务&#xff0c;怎么拆分为微服务的架构 将一个单体应用程序拆分成微服务架构是一个复杂的过程&#xff0c;需要深入的计划和实施。以下是一般的步骤和策略&#xff0c;可以帮助您成功地将单体应用程序拆分为微服务&#xff1a; 理解单体应用程序&#xff…...

初试小程序轮播组件

文章目录 一、轮播组件&#xff08;一&#xff09;swiper组件1、功能描述2、属性说明 &#xff08;二&#xff09;swiper-item组件1、功能描述2、属性说明 二、案例演示&#xff08;一&#xff09;运行效果&#xff08;二&#xff09;实现步骤1、创建小程序项目2、准备图片素材…...

Centos7 Yum安装PHP7.2

1、安装源 安装php72w&#xff0c;是需要配置额外的yum源地址的&#xff0c;否则会报错不能找到相关软件包。 php高版本的yum源地址&#xff0c;有两部分&#xff0c;其中一部分是epel-release&#xff0c;另外一部分来自webtatic。如果跳过epel-release的话&#xff0c;安装…...

2020年09月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;铺砖 对于一个2行N列的走道。现在用12,22的砖去铺满。问有多少种不同的方式。 时间限制&#xff1a;3000 内存限制&#xff1a;131072 输入 整个测试有多组数据&#xff0c;请做到文件底结束。每行给出…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...