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


相关推荐

  • Maven工具安装

    Maven工具安装

    2021年6月3日
    94
  • CMD-NET命令详解[通俗易懂]

    CMD-NET命令详解[通俗易懂]本文转自http://www.cnblogs.com/chenjq0717/archive/2010/05/09/1730934.html  net命令大全,net命令用法,net网络命令,net命令使用,net命令集,net命令介绍,net常用命令,net命令的使用技巧,net命令如何使用 大家在操作Windows9X/NT/2000/XP/2003系统的过程中,都会或多或少

    2022年5月8日
    63
  • 教你如何把M3U8转换成MP4丨NueXini M3U8 Downloader

    教你如何把M3U8转换成MP4丨NueXini M3U8 Downloader准备工具:https://www.lanzous.com/i18d7sh步骤:1.下载软件并且解压到非中文目录,然后打开主程序2.把M3U8的网络地址,或者下载到本地的M3U8文件拖入编辑框(红色箭头)3.点击解析(这里使用网络地址:http://nuexini.shop/ceshi.m3u8)4.点击开始(软件自动下载并且完成合并)5.完成!!!…

    2022年6月24日
    41
  • xsync同步脚本的使用

    xsync同步脚本的使用xsync同步脚本的使用1.简介在集群机器配置时,经常需要将一个文件或目录copy到同样的多台集群上,如果一个一个机器去复制,比较麻烦。如果有一个办法,通过一条命令就可以实现这个目的,就简单多了。xsync就是这样一个同步脚本。xsync其实是对rsync脚本的二次封装,脚本内容可以根据自己需要进行修改。2.配置集群hostname2.1配置hostname文件在每台机器执行命令c…

    2022年6月2日
    29
  • Linux iptables

    Linux iptables

    2021年8月23日
    44
  • 三极管的饱和导通条件[通俗易懂]

    三极管的饱和导通条件[通俗易懂]请看图,假设三极管基极电流为1MA,三极管直流放大倍数为50,那么在三极管集电极就有50MA电流。这时如果RL取100Ω,那么在RL两端分得电压5V,而另5V就加在三极管上,这时三极管处于正常放大状态。如果RL取300Ω呢?根据计算。在RL上应该分得15V电压。如果电源电压超过15V,那么这个电路仍处于放大壮态。可这里电源电压只有10V,那么这10V电压几乎全加在了电阻上,而三极管…

    2022年6月29日
    90

发表回复

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

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