Python 之 cPickle用法

Python 之 cPickle用法序列化就是通过特殊的方法将数据存储到相应存储区的过程,反序列化就是依据数据序列化时的规则进行反向执行,以取出原数据的过程。在编写程序的过程中,我们有时需要将数据进行序列化与反序列化的操作,本篇博客旨在阐述序列化与反序列化的作用及举例说明几个常用方法的使用。

大家好,又见面了,我是你们的朋友全栈君。

一、概述

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

个人理解序列化就是通过特殊的方法将数据存储到相应存储区的过程, 反序列化就是依据数据序列化时的规则进行反向执行, 以取出原数据的过程。

Java 中有序列化与反序列化的操作, 在 Python 中可以进行同样的操作。使用 Python 进行对象的序列化与反序列化操作时, 我们不用考虑其中的细节, 因为 Python 已经帮我们封装好了相关的类, 也就是这篇博文的主角——cPickle。

二、序列化与反序列化的几个常用方法

我们使用 cPickle 类会经常使用到四个方法: dump()、 load()、 dumps()、 loads()。

2.1 dump() 与 load()

>>> # 创建需要被操作的数据并输出:
>>> data = [{'key': 'value'}, ['a list in an other list'], 'a str', 888]
>>> print data
[{'key': 'value'}, ['a list in an other list'], 'a str', 888]
>>> # 以二进制写的方式打开一个文件, 并赋给一个变量 write_file:
>>> write_file = open('./MyWorkPlace/test.pkl', 'w+')
>>> # 使用 dump() 方法将数据序列化到上一步打开的文件中:
>>> cPickle.dump(data, write_file)
>>> # 关闭文件
>>> write_file.close()
>>> # 以二进制读的方式打开序列化数据后的文件, 并赋给变量 read_file:
>>> read_file = open('./MyWorkPlace/test.pkl', 'r+')
>>> # 使用 load() 方法将该文件中的数据反序列化后输出:
>>> print cPickle.load(read_file)  # 可以看到输出来的数据与我们序列化至文件前的数据完全一样
[{'key': 'value'}, ['a list in an other list'], 'a str', 888]
>>> read_file.close()
>>>

2.2 dumps() 与 loads()

>>> # 使用 2.1 中的数据 data 通过 dumps() 进行序列化:
>>> dumps_content= cPickle.dumps(data)
>>> # 查看序列化后的数据的类型:
>>> print type(dumps_content)
<type 'str'>
>>> # 打印出序列化后的数据: (此时的数据与 2.1 中序列化至文件中的数据一样)
>>> print dumps_content
(lp1
(dp2
S'key'
p3
S'value'
p4
sa(lp5
S'a list in an other list'
p6
aaS'a str'
p7
aI888
a.
>>> # 使用 loads() 方法, 将刚才序列化后的数据进行反序列化:
>>> loads_content = cPickle.loads(dumps_content)
>>> # 查看 loads_content 类型:
>>> print type(loads_content)
<type 'list'>
>>> # 将 loads_content 输出:
>>> print loads_content  # 我们会发现, 其与序列化之前的数据(data)在类型与数据上完全一样
[{'key': 'value'}, ['a list in an other list'], 'a str', 888]
>>>

2.3 带 s 与不带 s 的区别

常用的 cPickle 类中的四个方法我们分成了两组进行其功能的展示, 但是带 s 与不带 s 的有什么区别呢?

  1. 不带 s 的两个(即 dump() 和 load())方法会将数据序列化后保存至文件中, 然后再从文件中取出并反序列化后备用;
  2. 带 s 的两个(即 dumps() 和 loads())方法则会将数据序列化后以字符串的格式保存在内存中, 然后再将字符串格式的数据反序列化后备用;

二者各自利弊, 就不在此赘述。

三、cPickle 类的孪生—— pickle

其实, 在 Python 中还有一个与 cPickle 功能基本相同的类——pickle。 二者的功能几乎完全一致, 其中最大的区别是: cPickle 是用 C 语言编写的类, 执行速度上传说中比 pickle 要快 1000 倍(本人没有试过, 有兴趣的小伙伴可以自行测试一下)。

pickle 模块使用的数据格式是 Python 专用的, 且不向后兼容, 由于是 Python 专用的数据格式, 所以其他语言也不能识别。 但是我们可以使用 Python 的 Json 包将数据转化为其他语言可以识别使用的格式。

我们可以这样理解, cPickle 与 pickle 包对于 Python 对象数据的序列化与反序列化的操作与接口完全一样(不一样的部分我们很少能使用到), 但是速度上 cPickle 却要比 pickle 快出很多倍, 所以推荐大家在需要的时候使用 cPickle 进行数据的序列化与反序列化。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149114.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月24日 下午11:00
下一篇 2022年6月24日 下午11:00


相关推荐

  • vscode 前端常用插件推荐「建议收藏」

    1.vscode简介vscode是微软开发的的一款代码编辑器,就如官网上说的一样,vscode重新定义(redefined)了代码编辑器。 当前市面上常用的轻型代码编辑器主要是:sublime,notepad++,editplus,atom这几种。 比起notepad++、editplus,vscode集成了许多IDE才具有的功能,比起它们更像一个代码编辑器; 比起sublime,…

    2022年4月7日
    61
  • 协方差的意义

    协方差的意义

    2021年12月8日
    50
  • 哈佛幸福课笔记上篇「建议收藏」

    哈佛幸福课笔记上篇「建议收藏」改变一生的课:哈佛幸福课笔记上篇第1课什么是积极心理学?第2课为什么要学习积极心理学?第3课幸福是一种随机现象吗?第4课积极的环境能改变人第5课环境的力量第6课乐观主义第7课逆境还是机遇?第8课感激链接:哈佛大学公开课:幸福课.《哈佛幸福课》是改变我生活最大的一项事物,没有之一。我学习了5遍幸福课,并且用过去6年的时间去尝试它践行它,感觉完全改变了我的生活。第1课什么是积极心理学?1.享受安静2.这门课不光是传授信息,而且关于如何变形。重要的不仅仅是获得了什么信息,还是何形状

    2022年7月25日
    12
  • Runnable接口的用法

    Runnable接口的用法1 定义一个类实现 Runnable 接口 2 覆盖 Runnable 接口中的 run 方法将线程要运行的代码放在 run 方法中 3 同过 Thread 类建立线程对象 4 将 Runnable 接口的子类对象作为实际参数传递给 Thread 类的构造函数 为什么要将 Runnable 接口的子类对象传递给 Thread 的构造函数 因为 自定义的 run 方法所属的对象是 Runnable 接口的子类对象 5 调用 Thread 类的 start 方法开启线程并调用 Runnable 接口子类的 run 方法 实现方式和继承的方式有什么区别

    2026年3月16日
    2
  • 求中位数Python_统计学中位数众数例题

    求中位数Python_统计学中位数众数例题首先需要数据源,这里随便写了一个:nums=[1,2,3,4]求均值和中位数均可以使用numpy库的方法:#均值np.mean(nums)#中位数np.median(nums)求众数方法一:在numpy中没有直接的方法,但是也可以这样实现:importnumpyasnpcounts=np.bincount(nums)#返回众数np.argmax(counts)  …

    2025年12月15日
    3
  • Java单例模式中双重检查锁的问题

    Java单例模式中双重检查锁的问题单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使用某种类型的同步。在努力创建更有效的代码时,Java程序员们创建了双重检查锁定习语,将其和单例创建模式一起使用,从而限制同步代码量。然而,由于一些不太常见的Java内存模型细节的原因,并不能保证这个双重检查锁定习语有效。它偶尔会失败,而不是总失败。此外,它失败的原因并不明显,还包含Java内存模型的一些隐秘细节。这些事实将导致代

    2022年7月25日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号