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 多线程的实例详解
Sep 07 Python
python操作列表的函数使用代码详解
Dec 28 Python
Tornado高并发处理方法实例代码
Jan 15 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
Python pickle模块实现对象序列化
Nov 22 Python
Python vtk读取并显示dicom文件示例
Jan 13 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
python中sklearn的pipeline模块实例详解
May 21 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
js实现导航跟随效果
2018/11/17 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
浅谈Python爬虫基本套路
2019/03/25 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
Servlet如何得到服务器的信息
2015/12/22 面试题
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
调查研究项目计划书
2014/04/29 职场文书
表彰大会新闻稿
2015/07/17 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
delete in子查询不走索引问题分析
2022/07/07 MySQL