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 functools模块学习总结
May 09 Python
Python获取央视节目单的实现代码
Jul 25 Python
Python冒泡排序注意要点实例详解
Sep 09 Python
python的pip安装以及使用教程
Sep 18 Python
Python 经典面试题 21 道【不可错过】
Sep 21 Python
Python中垃圾回收和del语句详解
Nov 15 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
numpy按列连接两个维数不同的数组方式
Dec 06 Python
python异常处理和日志处理方式
Dec 24 Python
套娃式文件夹如何通过Python批量处理
Aug 23 Python
Python实现随机爬山算法
Jan 29 Python
pytorch model.cuda()花费时间很长的解决
Jun 01 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知道与问问的采集插件代码
2010/10/12 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
实现PHP多线程异步请求的3种方法
2014/01/17 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
python操作oracle的完整教程分享
2018/01/30 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
python3 配置logging日志类的操作
2020/04/08 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
Python之京东商品秒杀的实现示例
2021/01/06 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
cf收人广告词大全
2014/03/14 职场文书
入党积极分子个人总结
2015/03/02 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
护士心得体会范文
2016/01/25 职场文书
使用vue判断当前环境是安卓还是IOS
2022/04/12 Vue.js