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利用hook技术破解https的实例代码
Mar 25 Python
windows系统中python使用rar命令压缩多个文件夹示例
May 06 Python
Python中MYSQLdb出现乱码的解决方法
Oct 11 Python
Python科学计算之NumPy入门教程
Jan 15 Python
python ansible服务及剧本编写
Dec 29 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
Python列表推导式与生成器用法分析
Aug 02 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
简单了解Django项目应用创建过程
Jul 06 Python
详解Python的爬虫框架 Scrapy
Aug 03 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 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 用sock技术发送邮件的函数
2007/07/21 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
PHP微信API接口类
2016/08/22 PHP
php json转换相关知识(小结)
2018/12/21 PHP
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
使用jquery实现以post打开新窗口
2014/03/19 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
20行python代码实现人脸识别
2019/05/05 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
python利用opencv实现颜色检测
2021/02/23 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
中学生运动会新闻稿
2014/09/24 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
拉贝日记观后感
2015/06/05 职场文书
教师见习总结范文
2015/06/23 职场文书
尊师重教主题班会
2015/08/14 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
js Proxy的原理详解
2021/05/25 Javascript