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实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
Python中的ceil()方法使用教程
May 14 Python
Python实现字典的遍历与排序功能示例
Dec 23 Python
python字典嵌套字典的情况下找到某个key的value详解
Jul 10 Python
微信公众号token验证失败解决方案
Jul 22 Python
Python实现滑动平均(Moving Average)的例子
Aug 24 Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 Python
pymysql模块的操作实例
Dec 17 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
学习Python爬虫的几点建议
Aug 05 Python
如何使用PyCharm及常用配置详解
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
咖啡的植物学知识
2021/03/03 咖啡文化
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
JavaScript 参考教程
2006/12/29 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
PHP守护进程实例
2015/03/06 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
详解python基础之while循环及if判断
2017/08/24 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
汽车销售经理岗位职责
2014/06/09 职场文书
公司股东合作协议书
2014/09/14 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
通知范文怎么写
2015/04/16 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis