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的Tornado框架的HTTP客户端的教程
Apr 24 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
python3.x实现base64加密和解密
Mar 28 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
Python-while 计算100以内奇数和的方法
Jun 11 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
Python谱减法语音降噪实例
Dec 18 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
Python基于Twilio及腾讯云实现国际国内短信接口
Jun 18 Python
详解Anaconda安装tensorflow报错问题解决方法
Nov 01 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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 手机归属地查询 api
2010/02/08 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
js实现跳一跳小游戏
2020/07/31 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
详细介绍Python函数中的默认参数
2015/03/30 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
python实现单链表的方法示例
2019/09/03 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
最好的商品表达自己:Cafepress
2019/09/04 全球购物
创业资金计划书
2014/02/06 职场文书
《菜园里》教学反思
2014/04/17 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL
Golang ort 中的sortInts 方法
2022/04/24 Golang
Windows Server 2008配置防火墙策略详解
2022/06/28 Servers