Python pickle类库介绍(对象序列化和反序列化)


Posted in Python onNovember 21, 2014

一、pickle

pickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。
 
python对象与文件之间的序列化和反序列化:

pickle.dump()

pickle.load()

如果要实现python对象和字符串间的序列化和反序列化,则使用:
pickle.dumps()

pickle.loads()

 
可以被序列化的类型有:
* None,True 和 False;
* 整数,浮点数,复数;
* 字符串,字节流,字节数组;
* 包含可pickle对象的tuples,lists,sets和dictionaries;
* 定义在module顶层的函数:
* 定义在module顶层的内置函数;
* 定义在module顶层的类;
* 拥有__dict__()或__setstate__()的自定义类型;
 

注意:对于函数或类的序列化是以名字来识别的,所以需要import相应的module。

二、pickle的运行过程

在大部分情况下,要是的对象picklable,我们不需要额外的代码。默认地pickle将智能地检查类和实例的属性,当一个类实例反序列化的时候,它的__init__()方法通常不被调用。而是首先创建一个未初始化的实例,然后再回复存储的属性。
 

但是可以通过实现下列的方法来修改默认的行为:

object.__getstate__() :默认地序列化对象的__dict__,但是如果你实现了__getstate__(),则__getstate__()函数返回的值将被序列化。

object.__setstate__(state) :如果类型实现了此方法,则在反序列化的时候,此方法用来恢复对象的属性。

object.__getnewargs__() : 如果实例构造的时候(__new__())需要参数,则需要实现此函数。

注意:如果__getstate__()返回False,则在反序列化的时候__setstate__()则不被调用。

有的时候为了效率,或上面的3个函数不能满足需求时,需要实现__reduce__()函数。

三、实例

import pickle
# An arbitrary collection of objects supported by pickle.

data = {

    'a': [1, 2.0, 3, 4+6j],

    'b': ("character string", b"byte string"),

    'c': set([None, True, False])

}
with open('data.pickle', 'wb') as f:

    # Pickle the 'data' dictionary using the highest protocol available.

    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
    

with open('data.pickle', 'rb') as f:

    # The protocol version used is detected automatically, so we do not

    # have to specify it.

    data = pickle.load(f)

    print(str(data))

四、修改picklable类型的默认行为  

class TextReader:

    """Print and number lines in a text file."""
    def __init__(self, filename):

        self.filename = filename

        self.file = open(filename)

        self.lineno = 0
    def readline(self):

        self.lineno += 1

        line = self.file.readline()

        if not line:

            return None

        if line.endswith('\n'):

            line = line[:-1]

        return "%i: %s" % (self.lineno, line)
    def __getstate__(self):

        # Copy the object's state from self.__dict__ which contains

        # all our instance attributes. Always use the dict.copy()

        # method to avoid modifying the original state.

        state = self.__dict__.copy()

        # Remove the unpicklable entries.

        del state['file']

        return state
    def __setstate__(self, state):

        # Restore instance attributes (i.e., filename and lineno).

        self.__dict__.update(state)

        # Restore the previously opened file's state. To do so, we need to

        # reopen it and read from it until the line count is restored.

        file = open(self.filename)

        for _ in range(self.lineno):

            file.readline()

        # Finally, save the file.

        self.file = file

        

reader = TextReader("hello.txt")

print(reader.readline())

print(reader.readline())

s = pickle.dumps(reader)

#print(s)

new_reader = pickle.loads(s)

print(new_reader.readline())
# the output is 

# 1: hello

# 2: how are you

# 3: goodbye

Python 相关文章推荐
python使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
python检测服务器是否正常
Feb 16 Python
python端口扫描系统实现方法
Nov 19 Python
使用Python的Flask框架实现视频的流媒体传输
Mar 31 Python
深入解析Python中的集合类型操作符
Aug 19 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
使用DataFrame删除行和列的实例讲解
Apr 08 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
django 简单实现登录验证给你
Nov 06 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 #Python
Python实现的下载8000首儿歌的代码分享
Nov 21 #Python
Python常用模块介绍
Nov 21 #Python
Python使用py2exe打包程序介绍
Nov 20 #Python
Python实现的tab文件操作类分享
Nov 20 #Python
Python实现的ini文件操作类分享
Nov 20 #Python
Python中列表、字典、元组、集合数据结构整理
Nov 20 #Python
You might like
收音机术语解释
2021/03/01 无线电
php文件上传的两种实现方法
2016/04/04 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
JavaScript自执行闭包的小例子
2013/06/29 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
2016/03/30 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python 字符串中的字符倒转
2008/09/06 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
python实现多线程的两种方式
2016/05/22 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
使用Python处理BAM的方法
2018/09/28 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
python 实现Harris角点检测算法
2020/12/11 Python
Python 可视化神器Plotly详解
2020/12/26 Python
客服实习的个人自我鉴定
2013/10/20 职场文书
环境工程求职简历的自我评价范文
2013/10/24 职场文书
中学生打架检讨书
2014/02/10 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫