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 相关文章推荐
pymssql ntext字段调用问题解决方法
Dec 17 Python
Python判断变量是否已经定义的方法
Aug 18 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
Python处理Excel文件实例代码
Jun 20 Python
Python分支结构(switch)操作简介
Jan 17 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
对python打乱数据集中X,y标签对的方法详解
Dec 14 Python
情人节快乐! python绘制漂亮玫瑰
Aug 18 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
详解Python流程控制语句
Oct 28 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 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
德生9700DX电路分析
2021/03/02 无线电
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
javascript常用函数(2)
2015/11/05 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
Python中取整的几种方法小结
2017/01/06 Python
Python 爬虫图片简单实现
2017/06/01 Python
python中的decimal类型转换实例详解
2019/06/26 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
《生命的药方》教学反思
2014/04/08 职场文书
交通事故调解协议书
2014/04/16 职场文书
技校毕业生自荐书
2014/05/23 职场文书
日语系毕业求职信
2014/07/27 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
会议开幕词
2015/01/28 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
运动会广播稿200字
2015/08/19 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
2022微信温控新功能上线
2022/05/09 数码科技