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实现方法
Nov 18 Python
简单介绍Python中的JSON使用
Apr 28 Python
python print 按逗号或空格分隔的方法
May 02 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
Python3中详解fabfile的编写
Jun 24 Python
利用pandas读取中文数据集的方法
Jul 25 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
Python中的引用和拷贝实例解析
Nov 14 Python
python保留小数位的三种实现方法
Jan 07 Python
Python学习之路安装pycharm的教程详解
Jun 17 Python
python打包多类型文件的操作方法
Sep 21 Python
Python中的tkinter库简单案例详解
Jan 22 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中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
php头像上传预览实例代码
2017/05/02 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
基于JSON数据格式详解
2017/08/31 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
Python_LDA实现方法详解
2017/10/25 Python
python3实现逐字输出的方法
2019/01/23 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
python中图像通道分离与合并实例
2020/01/17 Python
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
教师专业理论水平的自我评价分享
2013/11/09 职场文书
五年级音乐教学反思
2014/02/06 职场文书
创先争优个人承诺书
2014/08/30 职场文书
秋收起义观后感
2015/06/11 职场文书
春季运动会加油词
2015/07/18 职场文书