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中的exec、eval使用实例
Sep 23 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 Python
Python实现列表转换成字典数据结构的方法
Mar 11 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
Python一键安装全部依赖包的方法
Aug 12 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
python中delattr删除对象方法的代码分析
Dec 15 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语法速查表
2007/01/02 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
Derek Rose官网:英国高档睡衣、家居服和内衣品牌
2020/01/18 全球购物
医学生毕业自我鉴定
2014/03/26 职场文书
新春文艺演出主持词
2014/03/27 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
软件测试专业推荐信
2014/09/18 职场文书
受伤赔偿协议书
2014/09/24 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android