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中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
常见python正则用法的简单实例
Jun 21 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
django+js+ajax实现刷新页面的方法
May 22 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
Python从函数参数类型引出元组实例分析
May 28 Python
python opencv 简单阈值算法的实现
Aug 04 Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 Python
keras得到每层的系数方式
Jun 15 Python
python xlsxwriter模块的使用
Dec 24 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
Python中使用item()方法遍历字典的例子
2014/08/26 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
Python最小二乘法矩阵
2019/01/02 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
建筑工程管理专业自荐信范文
2013/12/28 职场文书
优秀党员事迹材料
2014/12/18 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
实施意见格式范本
2015/06/05 职场文书