大家好,又见面了,我是你们的朋友全栈君。
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 的有什么区别呢?
- 不带 s 的两个(即 dump() 和 load())方法会将数据序列化后保存至文件中, 然后再从文件中取出并反序列化后备用;
- 带 s 的两个(即 dumps() 和 loads())方法则会将数据序列化后以字符串的格式保存在内存中, 然后再将字符串格式的数据反序列化后备用;
二者各自利弊, 就不在此赘述。
三、cPickle 类的孪生—— pickle
其实, 在 Python 中还有一个与 cPickle 功能基本相同的类——pickle。 二者的功能几乎完全一致, 其中最大的区别是: cPickle 是用 C 语言编写的类, 执行速度上传说中比 pickle 要快 1000 倍(本人没有试过, 有兴趣的小伙伴可以自行测试一下)。
pickle 模块使用的数据格式是 Python 专用的, 且不向后兼容, 由于是 Python 专用的数据格式, 所以其他语言也不能识别。 但是我们可以使用 Python 的 Json 包将数据转化为其他语言可以识别使用的格式。
我们可以这样理解, cPickle 与 pickle 包对于 Python 对象数据的序列化与反序列化的操作与接口完全一样(不一样的部分我们很少能使用到), 但是速度上 cPickle 却要比 pickle 快出很多倍, 所以推荐大家在需要的时候使用 cPickle 进行数据的序列化与反序列化。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149114.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...