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 相关文章推荐
深入理解NumPy简明教程---数组2
Dec 17 Python
python使用Tesseract库识别验证
Mar 21 Python
教你使用python画一朵花送女朋友
Mar 29 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
深入理解python中sort()与sorted()的区别
Aug 29 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
python全栈知识点总结
Jul 01 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
django queryset相加和筛选教程
May 18 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 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
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
JavaScript中的this机制
2016/01/30 Javascript
JS常见算法详解
2017/02/28 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
解决option标签selected="selected"属性失效的问题
2017/11/06 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
2015年统战工作总结
2015/05/19 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书