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 模块EasyGui详细介绍
Feb 19 Python
tensorflow 1.0用CNN进行图像分类
Apr 15 Python
Python求解任意闭区间的所有素数
Jun 10 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
Python进度条的制作代码实例
Aug 31 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
python的time模块和datetime模块实例解析
Nov 29 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
python连接mongodb数据库操作数据示例
Nov 30 Python
python 自动识别并连接串口的实现
Jan 19 Python
python中如何对多变量连续赋值
Jun 03 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
PHP实现阳历到农历转换的类实例
2015/03/07 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
DEFER怎么用?
2006/07/01 Javascript
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
jQuery live
2009/05/15 Javascript
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
python del()函数用法
2013/03/24 Python
python自动zip压缩目录的方法
2015/06/28 Python
Python ftp上传文件
2016/02/13 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
python内置数据类型之列表操作
2018/11/12 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python如何安装第三方模块
2020/05/28 Python
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
写好自荐信要注意的问题
2013/11/10 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
教师工作证明范本
2015/06/12 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书