python中Pickle模块 串行化对象 系列化对象

2023-10-29 02:18

本文主要是介绍python中Pickle模块 串行化对象 系列化对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

python中Pickle模块时间:2010-08-29 14:41:10来源:网络 作者:未知 点击:170次 cPickle模块是使用C语言实现的,所以在运行效率上比pickle要高。但是cPickle模块中定义的类型不能被继承(其实大多数时候,我们不需要从这些类型中继承。)。cPickle和pickle的序列化/反序列化规则是一样的,我们可以使用pickl
cPickle模块是使用C语言实现的,所以在运行效率上比pickle要高。但是cPickle模块中定义的类型不能被继承(其实大多数时候,我们不需要从这些类型中继承。)。cPickle和pickle的序列化/反序列化规则是一样的,我们可以使用pickle序列化一个对象,然后使用 cPickle来反序列化。同时,这两个模块在处理自引用类型时会变得更加“聪明”,它不会无限制的递归序列化自引用对象,对于同一对象的多次引用,它只会序列化一次。
笔记:序列化一个对象。将一个对象给序列化!
示例:
list = []
list.append(list)
byt2 = pickle.dumps(list)
 
默认情况下,pickle的序列化是基于文本的,我们可以直接用文本编辑器查看序列化的文本。我们也可以序列成二进制格式的数据,这样的结果体积会更小。
pickle.dump(obj, file[, protocol])
  序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle.load(file)
  反序列化对象。将文件中的数据解析为一个Python对象。
笔记:序列化过程将一个python对象序列化成文本或二进制。反序列刚好相反
 
class Person:
    def __init__(self,name,address):
        self.name = name
        self.address = address
   
    def dispaly(self):
        print'name',self.name,'address',self.address
   
people = Person('JGood','china')
people.dispaly()
file = StringIO.StringIO()
pickle.dump(people,file,0)
print file.getvalue()
结果为:
(i__main__
Person
p0
(dp1
S'name'
p2
S'JGood'
p3
sS'address'
p4
S'china'
p5
sb.
 
这样就将一个对象给序列化了。
 
反序列操作
file.seek(0)
j1 = pickle.load(file)
j1.dispaly()
 
慢慢地发现序列化好像可以实现这样的操作哦。比如说我先将一个对象序列化到一个StringIO对象了即内存中去。然后程序可以休棉或干嘛。然后再反序列出来。
比如像游戏中的保存游戏状态再进来。其实这种效果应该是与序列化的效果一致的吧。
 
python模块中还定义了两个类,分别用来序列化、反序列化对象。
class pickle.Pickler(file[, protocal]):
  该类用于序列化对象。参数file是一个类文件对象(file-like object),用于保存序列化结果。可选参数表示序列化模式。它定义了两个方法:
dump(obj):
  将对象序列化,并保存到类文件对象中。参数obj是要序列化的对象。[]
clear_memo()
  清空pickler的“备忘”。使用Pickler实例在序列化对象的时候,它会“记住”已经被序列化的对象引用,所以对同一对象多次调用 dump(obj),pickler不会“傻傻”的去多次序列化。如果你调用了这个方法就会去多次序列化了。
将上面的示例重写:
people = Person('JGood','china')
people.dispaly()
file = StringIO.StringIO()
pick = pickle.Pickler(file)
pick.dump(people)
print file.getvalue()
 
class pickle.Unpickler(file):
  该类用于反序列化对象。参数file是一个类文件(file-like object)对象,Unpickler从该参数中获取数据进行反序列化。
load():
  反序列化对象。该方法会根据已经序列化的数据流,自动选择合适的反序列化模式。
 
以下是其他的示例补充:
<!--[if !supportLists]-->1.     <!--[endif]-->将一个对象序列化到一个文本
class Person:
    def __init__(self,name,address):
        self.name = name
        self.address = address
   
    def dispaly(self):
        print'name',self.name,'address',self.address
   
people = Person('JGood','china')
people.dispaly()
output = open('data.pkl', 'wb')
pick = pickle.Pickler(output)
pick.dump(people)
<!--[if !supportLists]-->2.     <!--[endif]-->将对象从文本中读取回来
pkl_file = open('data.pkl', 'rb')       读取到此文本内容
data1 = pickle.load(pkl_file)           反序列化
data1.dispaly()                         跟调用这个类是一样的了
 
我测试发现了。如果将这个类给删除掉就会报:AttributeError: 'module' object has no attribute 'Person'
看来还得让反序列后的数据能够找到这个类才行!
 
补充:对象序列化
序列化就是将内存中的对象保存成可存或可传的形式。一般情况下,对象是根据类被实例化到托管堆上的,一旦进程退出,整个对象被释放掉,如果再次实例化类,所得的对象,与先前的对象状态是不一样的,为此,序列化就成为一个有效的解决方式。
笔记:对象在程序退出的时候就会自动退了。所以可以通过序列化保存起来!
总结一句话,序列化就是把对象中的数据按一定规则组织成文件存储或组织成网络流进行传输(Remoting中用到)
本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2010/0829/25490.php

这篇关于python中Pickle模块 串行化对象 系列化对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/297590

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py