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爬虫之HTTP异常处理
Nov 05 Python
python中dir函数用法分析
Apr 17 Python
编写Python的web框架中的Model的教程
Apr 29 Python
python socket多线程通讯实例分析(聊天室)
Apr 06 Python
Python将多个excel文件合并为一个文件
Jan 03 Python
Python处理中文标点符号大集合
May 14 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
python实现给微信指定好友定时发送消息
Apr 29 Python
Python实现自定义读写分离代码实例
Nov 16 Python
python求绝对值的三种方法小结
Dec 04 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 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
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
详解如何运行vue项目
2019/04/15 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
python中urllib模块用法实例详解
2014/11/19 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
python 输出所有大小写字母的方法
2019/01/02 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
python实现简单的tcp 文件下载
2020/09/16 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
高中语文课后反思
2014/04/27 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
颐和园英文导游词
2015/01/30 职场文书
自我推荐信格式模板
2015/03/24 职场文书
小学数学教师研修日志
2015/11/13 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
Java 关于String字符串原理上的问题
2022/04/07 Java/Android
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL