python cPickle 与 pickle模块序列化详解

简介: python cPickle 与 pickle模块序列化详解

python 模块 cPickle 与 pickle 序列化

文章目录

1. 序列化

cPickle 模块通过实现将任意 python 对象转换为一系列 Bytes 的算法来帮助我们。Pickle 模块也带有类似类型的程序。但是 2 之间的区别在于cPickle 更快并且在 C 中实现了算法。cPickle 优于 Pickle 的唯一缺点是它不允许用户从 Pickle 子类化。简而言之,我们可以得出结论,使用 cPickle 是出于对象序列化的动机。


对象的序列化在很多高级编程语言中都有相应的实现,Python也不例外。程序

运行时,所有的变量都是在内存中的,例如在程序中声明一个dict对象,里面存储 着爬取的页面的链接、页面的标题、页面的摘要等信息:

   d = dict(url='index.html',title='首页',content='首页')

在程序运行的过程中爬取的页面的链接会不断变化,比如把url改成了 second.html,但是程序一结束或意外中断,程序中的内存变量都会被操作系统进 行回收。如果没有把修改过的url存储起来,下次运行程序的时候,url被初始化为 index.html,又是从首页开始,这是我们不愿意看到的。所以把内存中的变量变成 可存储或可传输的过程,就是序列化。

将内存中的变量序列化之后,可以把序列化后的内容写入磁盘,或者通过网络 传输到别的机器上,实现程序状态的保存和共享。反过来,把变量内容从序列化的 对象重新读取到内存,称为反序列化。

在Python中提供了两个模块:cPickle和pickle来实现序列化,前者是由C语 言编写的,效率比后者高很多,但是两个模块的功能是一样的。一般编写程序的时 候,采取的方案是先导入cPickle模块,如果此模块不存在,再导入pickle模块。 示例如下:

 try:        
     import cPickle as pickle     
 except ImportError:        
     import pickle

pickle实现序列化主要使用的是dumps方法或pickle实现序列化主要使用的是方法。dumps方法可以将任 意对象序列化成一个str,然后可以将这个str写入文件进行保存。在Python

dumps将对象序列化为str

>>> import cPickle as pickle     
>>> d = dict(url='index.html',title='首页',content='首页')     
>>> pickle.dumps(d)     
"(dp1\nS'content'\np2\nS'\\xca\\xd7\\xd2\\xb3'\np3\nsS'url'\np4\nS'index.html'\n     p5\nsS'title'\np6\ng3\ns."

dump写入文件

>>> f=open(r'D:\dump.txt','wb')     
 >>> pickle.dump(d,f)     >>>
 >>> f.close()

2. 反序列化

pickle实现反序列化使用的是loads方法或load方法。把序列化后的文件从磁 盘上读取为一个str,然后使用loads方法将这个str反序列化为对象,或者直接使 用load方法将文件直接反序列化为对象,如下所示:

>>> f=open(r'D:\dump.txt','rb')     
>>> d=pickle.load(f)     
>>> f.close()     
>>> d     
{'content': '\xca\xd7\xd2\xb3', 'url': 'index.html', 'title': '\xca\xd7\xd2\xb3'}

通过反序列化,存储为文件的dict对象,又重新恢复出来,但是这个变量和原 变量没有什么关系,只是内容一样。以上就是序列化操作的整个过程。

假如我们想在不同的编程语言之间传递对象,把对象序列化为标准格式是关 键,例如XML,但是现在更加流行的是序列化为JSON格式,既可以被所有的编程语 言读取解析,也可以方便地存储到磁盘或者通过网络传输。python json文本操作请参考


参考:


cPickle in Python Explained With Examples

Serializing Data Using the pickle and cPickle Modules

pickle and cPickle – Python object serialization

“python3 cpickle” Code Answer’s


相关文章
|
5天前
|
Python
Python Internet 模块
Python Internet 模块。
100 74
|
23天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
104 63
|
25天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
25天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
25天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
下一篇
DataWorks