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

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

基本流程

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

python中pickle模块_Python pickle模块的用法相关推荐

  1. python中getopt函数_python getopt模块使用方法

    python中 getopt 模块,是专门用来处理命令行参数的 getop标准格式: 函数getopt(args, shortopts, longopts = []) shortopts 是短参数   ...

  2. python中math函数_Python math模块 数学函数教程

    在Python基础教程中,大家都已经了解了Python有很多运算符可以进行一些数学运算,但是要处理复杂的问题是不是所有代码都要自己一行一行的来编写呢? 玩蛇网提醒大家,这个时候,最先想到的就应该是py ...

  3. python中getopt函数_python getopt模块详解

    getopt这个函数 就是用来抽取 sys.argv 获得的用户输入来确定执行步骤. getopt是个模块,而这个模块里面又有getopt 函数,所以getopt需要这样这样用. getopt.get ...

  4. python中bytearray函数_python函数之bytearray用法详解

    bytearray([source [, encoding [, errors]]]) 中文说明: bytearray([source [, encoding [, errors]]])返回一个byt ...

  5. python中uniform函数_python scipy stats.uniform用法及代码示例

    均匀连续随机变量. 在标准形式下,分布均匀[0, 1].使用参数loc和scale,在上获得均匀分布[loc, loc + scale]. 作为一个实例rv_continuous类,uniform对象 ...

  6. python中options类_Python的OptionParser模块

    Python中强大的选项处理模块. 示例 #!/usr/bin/pythonfrom optparse import OptionParser parser = OptionParser() pars ...

  7. python pp模块_python常用模块

    1.re模块 re模块用于对python的正则表达式的操作 1.1 什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物 ...

  8. Python中常用的数据分析工具(模块)有哪些?

    本期Python培训分享:Python中常用的数据分析工具(模块)有哪些?Python本身的数据分析功能并不强,需要安装一些第三方的扩展库来增强它的能力.我们课程用到的库包括NumPy.Pandas. ...

  9. Python中计算程序的运行时间——timeit模块

    Python中计算程序的运行时间--timeit模块 绪论 一.timeit的基本用法 1.1 timeit.timeit()函数: 创建一个Timer实例,并运行代码进行计时,默认将代码执行一百万次 ...

  10. python中text格式_python读取各种格式的文本

    1. 读取word文本 Python可以利用python-docx模块处理word文档,处理方式是面向对象的,python-docx模块会把word文档中的段落.文本.字体等都看做对象,对对象进行处理 ...

最新文章

  1. java调用项目中的文件_详解eclipse项目中.classpath文件的使用
  2. 开源的那些事儿之如何看待开源
  3. 【字节码插桩】Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术
  4. linux基本操作之目录、vi等
  5. Tensorflow加载模型(进阶版):如何利用预训练模型进行微调(fintuning)
  6. 【大话数据结构算法】希尔排序
  7. /var/spool/postfix/maildrop小文件太多造成inode索引使用完解决
  8. Greenplum小把戏 - 你所不知道的时间戳长度玩法
  9. 又一数据库高危漏洞爆出,数据安全如何有效保障?
  10. linux常用的日志分析脚本
  11. Bailian3253 集合的划分【递归】
  12. dispatch js实现_js实现对象自定义事件,触发,on监听事件的方式
  13. 级差公排php如何_矩阵,双轨,级差三种制度的对话
  14. 数据库perl脚本:创建SDB各表,并导入数据
  15. Unity通过鼠标或者手势实现拉进拉远,旋转等操作的常用方法
  16. 面试题(javamysql)
  17. [OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器
  18. nginx、php本地配置https
  19. 嵌入式linux开发板使用pulseaudio连接蓝牙耳机播放音频文件
  20. Steam教育对教培机构的重要影响力

热门文章

  1. Java9都快发布了,Java8的十大新特性你了解多少呢?
  2. 脱裤子放屁,多此一举
  3. 递归判断一个数是否递增
  4. 每天进步一点点:andriod学习从零开始
  5. hwnd = 0 各种粗心大意啊!
  6. Oracle中临时表的深入研究
  7. 从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程
  8. 深度学习环境搭建之Anaconda安装keras
  9. mysql常见错误解决方法_mysql常见错误解决办法
  10. php 两个数组中不同的元素,PHP实现查询两个数组中不同元素的方法