当前位置: 首页 > 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;请做到文件底结束。每行给出…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...