python中pickle模块_Python pickle模块的用法

串行化主要用于网络传输或者持久化。我们知道,网络上的数据都是字节流,如果希望将某个对象传送给远端的机器,首先就必须将其转换成字节流,然后才可以在网络上传输。文件也是字节流,如果希望将某个对象保存到文件中,首先也是需要将其转换成字节流,然后才可以保存。

与串行化对应的是反串行化,即从字节流中恢复出原来的对象。这样传输才有意义。

基本流程

将串行化和反串行化与网络传输合并起来,便可以得到如图 1 所示的描述过程。

图 1 串行化和反串行化

如果是通过文件永久保存或备份数据,则可以使用图6-2来表示该过程。

图 2 对象保存的过程

可以看出,串行化在这两个领域是非常有用的。串行化的基本要求即是恢复的对象要等价于原来的对象,不能有信息丢失现象。

pickle用法

串行化相关的模块很多,如 pickle、cpickle、json 和 marshal 等,它们都在转换效率和压缩效率上下了不少功夫,但其基本功能大同小异。所以本教程并不会将这些模块都进行详细介绍,主要介绍 pickle 库的用法。

pickle 不用安装,其是 Python 自带的包,使用时仅需要引入该包即可。方法如下:

import pickle

pickle 包主要提供了两个功能,一个是将对象转换成字节流,即串行化;另一个是将字节流转换成对象,即反串行化。每个功能又分出了两个分支,一个是仅转换成字节流,另一个是转换成字节流并保存到文件中去。所以 pickle 包主要有 4 个接口,如表 3 所示。

表 3 pickle包的主要接口串行化

操 作串行化反串行化

转换+文件操作

dump()

load()

转换

dumps()

loads()

1) dump(对象,文件对象):串行化并保存到文件

dump 的文件对象要求是可写的。

>>> a = range(10)

>>> a

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> fd = open("tmp,bin", "wb")

>>> fd

>>> 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]

2) load(文件对象):从文件读数据并恢复出对象

load 函数从文件对象中读出一个对象,返回值就是该对象。上面的例子中演示了如何使用该接口函数。

3) dumps(对象):仅串行化

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)

>>> b = pickle.loads(s)

>>> b

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

4) loads(字节流):从字节流中恢复出对象

输入应该是 dumps() 的返回值。注意,不要随意构造字节流,因为并不是所有的字节流都能被解析出来。该接口函数的用法在上面的例子中已经演示过了。

另外,可不可以将多个对象保存到一个文件中呢?答案是可以。如果需要写入多个对象,则可以多次调用 dump() 函数。同样,在恢复时也要多次调用 load() 函数。它们之间的对应关系是,第一次 load() 得到的对象是第一次 dump() 对应的对象,第二次 load() 得到的对象是第二次 dump() 对应的对象,简单来说就是先进先出。

下面的代码演示了这个用法。

>>> a1 = range(3)

>>> a1

[0, 1, 2]

>>> a2 = range(5)

>>> a2

[0, 1, 2, 3, 4]

>>> fd = open("tmp,bin", "wb")

>>> pickle.dump(a1, fd) # 先写入短的列表

>>> pickle.dump(a2, fd) # 再写入长的列表

>>> fd.close()

>>> fd2 = open("tmp,bin", "rb")

>>> b1 = pickle.load(fd2)

>>> b1 # 先读出来的是短的列表

[0, 1, 2]

>>> b2 = pickle.load(fd2)

>>> b2 # 再读出来的是长的列表

[0, 1, 2, 3, 4]

>>> fd2.close()

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

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

相关文章

电子测量与仪器第四版pdf_准确选择表面粗糙度仪的测量参数应该从哪些地方着手好【电子仪器吧】...

表面粗糙度仪的参数怎么选择?首先要先满足运用功能要求,其次再兼顾经济性能。即,在满足运用要求的前题下,尽可能下降外表粗糙度要求,放大表面粗糙度允许值。对多数外表面来说,给出高度特色评定参数即可反映…

Linux的实际操作:文件目录类的实用指令(重定向“>“和追加“>>“)

1. > 表示重定向 (重定向什么意思呢?就是把一个文件的内容,保存到指定的位置) > 是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空&#…

wrapper怎么用_用责任链模式设计拦截器

我在 Redant(https://github.com/all4you/redant) 中通过继承 ChannelHandler 实现了拦截器的功能,并且 pipeline 就是一种责任链模式的应用。但是我后面对原本的拦截器进行了重新设计,为什么这样做呢,因为原本的方式是在 ChannelHandler 的基…

VS2019 配色_这个双11,凯里-欧文陪你过!欧文6正式发布,城市版配色真的香

北京时间11月5日,在篮网主场对阵鹈鹕的比赛中,欧文一上场就让教主眼前一亮,这鞋骚的有点过分啊。欧文6代已经于北京时间11月5日正式发布,虽然首发配色毫无惊喜,毕竟早在休赛期就已经被曝得连底裤都不剩了,但…

Linux的实际操作:文件目录类的实用指令(echo head tail)

1.echo 输出内容到控制台 例子:实用echo指令输出环境变量,输出当前的环境变量路径 2.head 用于显示文件的开头部分内容,默认情况下head显示文件的前10行内容(因为有些文件比较大,我们有时候不全去看) 空格…

如何延长作用域链_通过实例理解javaScript中的this到底是什么和它的词法作用域...

最近,听到李笑来说,讲解编程的过程中,举例子很重要。而且,我最近看的各种javaScript工具书中的例子,也都有点复杂。所以啊,我试着举一些简单又直观的例子,与各位苦学javaScript的同学&#xff0…

word2vector数据集样式_这样做数据可视化驾驶舱,高端大气,一目了然,领导不点赞都难...

2020年了,数据可视化已经不是个新鲜词了,把数据以可视化图表的形式展示并没有多神奇,用Excel等传统的办公工具就可以轻松实现。以前传统数据分析报告就是ppt里贴图表,再配上分析结论,这种形式的数据呈现是静态的&#…

Linux的实际操作:文件目录类的实用指令(ln history)

1.ln 软连接也叫做符号链接,类似于windows的快捷方式,主要是存放了链接其它文件的路径 ln -s 原文件或者目录 软链接名 (功能:给原文件创建一个软链接) 案例:将/roo…

mysql 删除重复数据_日常答疑|MySQL删除重复数据踩过得坑

问题群友提问:MySQL这样删除重复数据为啥不成功呢?严小样儿:安排!咋一看,大家都说where子句里面应该使用极值函数,加个max就对了,这么简单!# 大家想象中这样写是对的,其实…

搜狗手机浏览器_搜狗推广开户费多少钱?【搜狗开户代理商】

搜狗开户流程提供落地页审核提供服务器ip 安排解析账户预存款4000币上传关键词及素材开启广告上线福如海广告,搜狗开户代理商全国行业开户,有无资质均可手机:18705657032【同微信】搜狗广告详细介绍搜狗广告展现形式PC端-搜狗搜索推广当网民在…

Linux命令终端提示符显示-bash-4.2#解决方法【转载】

昨天在配置linux,突然发现root登录的CRT的终端提示符显示的是-bash-4.2# 而不是root主机名 路径的显示方式。搞了半天也不知道为什么出现这种情况。今天终于搞定这个问题, 原因是root在/root下面的几个配置文件丢失,丢失文件如下&#xff1a…

python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼严格意思上的说,Python其实是一个脚本语言,编程语言多种多样,但是却有开源和闭源之分,Python就是一种开放核心源代码编程语言,其开发代码的效率非常高,代码编写…

understand 6.0_软件工程专业篇-vc++6.0安装教程(解决win10不兼容)

在进行安装教程之前还是和大家说几句废话啊。VC6.0就是出品的一款开发C的IDE。所谓IDE就是:为了方便程序员开发,集成了代码编辑器、编译器、链接器、调试器等工具的集成开发环境。 现在外面企业已经很少有使用VC6.0的了,毕竟已经是将近17年前…

Linux的实际操作:时间日期类的实用指令(date cal)

1.date 显示当前日期 (1)date 显示当前时间 (2) date %Y 显示年份 date%m 显示月份 date%d 显示日 date "%Y-%m-%d %H:%M:%S" 显示年月日时分秒 注意:加号不能少 双引号中间的连接可以取任意符号 &a…

python如何为饼图添加标题_python – Matplotlib子图标题,图标题格式

我将如何格式化下面的饼图子图,以便在图标题和子图标题之间有更多的空白区域.理想情况下,子图标题也会更接近实际的饼图本身.我似乎无法在文档中找到任何可能启用此功能的内容,但我是matplotlib的新手.import matplotlib.pyplot as pltimport pandas as pdfrom pandas import D…

Linux的实际操作:搜索查找类的实用指令(find locate grep 管道符|)

1.find 将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端 find 【搜索范围】 【选项】 文件 (搜索范围往往是绝对路径或者相对路径) 选项功能-name按照指定文件名查找文件-user查找属于指定用户名所有…

error:java:无效的源发行版_IDEA java出现无效的源发行版14解决方案_java

这篇文章主要介绍了IDEA java出现无效的源发行版14解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下问题描述问题原因出现该问题的原因是项目Project当中的jdk与电脑当中的jdk版本不一致造成的。解决方法…

为什么买入不了创业版_详解实战抄底——如何抄到下引线的最底端。及妖股的首板买入点...

11月26日上周四,如果方便的朋友可以打开下创业板当天的分时图,更加有利于理解。(下图所示)主板和创业板11月26日分时图当天创业板冲高回落开始探底,我在10点17分的时候提示准备抄底,在10点22分的时候,再次强调创业板跌…

Linux的实际操作:文件目录类实用指令(压缩gzip tar -zcvf和解压缩gunzip tar -zxvf)

1.gzip 用于压缩文件 (压缩文件后,原文件就会消失自动成为一个新的压缩文件,意思是压缩后不保留原文件) 2.gunzip 用于解压文件 (解压缩后,压缩文件也会自动生成一个未解压文件&…

python最常用的编程方式是什么_python常用模块和对象编程

1.摘要常用模块对象编程领域模型2.常用模块2.1shutil模块2.1.1 shutil.copyfileobj(fsrc, fdst[, length])1 f open("test.txt","r",encoding"utf-8")2 f1 open("test2.txt","w",encoding"utf-8")34 shutil.cop…