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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • oracle的minus返回第一个表中有、第二个表中没有的数据

    oracle的minus返回第一个表中有、第二个表中没有的数据推荐:http://www.cnblogs.com/roucheng/p/3504463.html

    2021年12月23日
    44
  • mvnw的作用_尼康D200色影无忌

    mvnw的作用_尼康D200色影无忌mvnw

    2025年6月8日
    2
  • 编码器的工作原理_编码器的应用

    编码器的工作原理_编码器的应用最近公司项目用到了编码器选用的编码器为360脉冲为了方便其一圈发360个脉冲,当然精度只有一度,如果为了高精度可以选用其他类型的首先简述一下编码器的工作原理编码器可按以下方式来分类。1、按码盘的刻孔方式不同分类(1)增量型:就是每转过单位的角度就发出一个脉冲信号(也有发正余弦信号,编码器(图1)然后对其进行细分,斩波出频率更高的脉冲),通常为A相、B相、Z…

    2022年10月1日
    2
  • Sklearn中的CV与KFold详解

    Sklearn中的CV与KFold详解关于交叉验证,我在之前的文章中已经进行了简单的介绍,而现在我们则通过几个更加详尽的例子.详细的介绍CV%matplotlibinlineimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearnimportdatasetsfromsklearnimports…

    2022年9月20日
    4
  • 【Python秒杀脚本】淘宝或京东等秒杀抢购

    【Python秒杀脚本】淘宝或京东等秒杀抢购提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、环境二、安装1.ChromeDriver安装2.Seleuinm安装3.淘宝秒杀脚本4.京东秒杀脚本总结前言提示:这里可以添加本文要记录的大概内容:我们的目标是秒杀淘宝或京东等的订单,这里面有几个关键点,首先需要登录淘宝或京东,其次你需要准备好订单,最后要在指定时间快速提交订单。这里就要用到一个爬虫利器Selenium,Selenium是一个用于Web应用程序测试的工具,Selenium可以直接运行在浏览器中,通.

    2022年5月7日
    48
  • filezilla server中文版使用教程_filezilla安装步骤

    filezilla server中文版使用教程_filezilla安装步骤filezillaserver下载、安装、配置教程下载filezillaserver安装filezillaserverFileZillaServer的配置教程下载filezillaserverfilezillaserver官网:FileZilla-ThefreeFTPsolution:https://filezilla-project.org/安装filezill……………

    2022年9月15日
    4

发表回复

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

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