百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python pickle模块的用法(python里pickle的详细用法)

itomcoil 2025-03-14 18:06 27 浏览

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

基本流程

将串行化和反串行化与网络传输合并起来,便可以得到如图 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()

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...