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 相关文章推荐
Python3基础之函数用法
Aug 13 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
Jun 09 Python
python 输出所有大小写字母的方法
Jan 02 Python
Django文件存储 默认存储系统解析
Aug 02 Python
python字典的遍历3种方法详解
Aug 10 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
python pyenv多版本管理工具的使用
Dec 23 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
Python JSON常用编解码方法代码实例
Sep 05 Python
Python request中文乱码问题解决方案
Sep 17 Python
python 通过使用Yolact训练数据集
Apr 06 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
浅析JavaScript动画
2015/06/10 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
vue中注册自定义的全局js方法
2019/11/15 Javascript
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
python保存网页图片到本地的方法
2018/07/24 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
Tensorflow 多线程设置方式
2020/02/06 Python
python中判断文件结束符的具体方法
2020/08/04 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
李维斯牛仔裤英国官方网站:Levi’s英国
2019/10/10 全球购物
计算机应用专业毕业生求职信
2013/10/24 职场文书
会计电算化应届生求职信
2013/11/03 职场文书
党员教师工作决心书
2014/03/13 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏