Python pickle类库介绍(对象序列化和反序列化)

 更新时间:2014年11月21日 09:20:03   投稿:junjie  
这篇文章主要介绍了Python pickle类库介绍(对象序列化和反序列化),本文讲解了pickle库的作用、pickle的运行过程、使用实例、修改picklable类型的默认行为等内容,需要的朋友可以参考下

一、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


相关文章

  • Pandas如何通过np.array函数或tolist方法去掉数据中的index

    Pandas如何通过np.array函数或tolist方法去掉数据中的index

    这篇文章主要介绍了Pandas如何通过np.array函数或tolist方法去掉数据中的index问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python利用蒙特卡罗模拟期权定价

    Python利用蒙特卡罗模拟期权定价

    期权是一种合约,它赋予买方在未来某个时间点以特定价格买卖资产的权利。本文将利用蒙特卡罗模拟期权定价,感兴趣的小伙伴可以了解一下
    2022-04-04
  • python中_del_还原数据的方法

    python中_del_还原数据的方法

    在本篇内容里小编给大家整理了一篇关于python中_del_还原数据的方法,有兴趣的朋友们可以学习下。
    2020-12-12
  • python实现百万答题自动百度搜索答案

    python实现百万答题自动百度搜索答案

    这篇文章主要为大家详细介绍了python实现百万答题自动百度搜索答案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python命令行参数化的四种方式详解

    Python命令行参数化的四种方式详解

    在日常编写 Python 脚本的过程中,我们经常需要结合命令行参数传入一些变量参数,使项目使用更加的灵活方便。本文章罗列了构建 Python命令行参数的4种常见方式,需要的可以参考一下
    2022-06-06
  • AUC计算方法与Python实现代码

    AUC计算方法与Python实现代码

    今天小编就为大家分享一篇AUC计算方法与Python实现代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python爬虫之xpath的基本使用详解

    python爬虫之xpath的基本使用详解

    本篇文章主要介绍了python爬虫之xpath的基本使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • python实现数独游戏 java简单实现数独游戏

    python实现数独游戏 java简单实现数独游戏

    这篇文章主要为大家详细介绍了python实现数独游戏和java实现数独游戏的相关代码,比较两种语言实现数独游戏的区别
    2018-03-03
  • Python基于回溯法子集树模板解决找零问题示例

    Python基于回溯法子集树模板解决找零问题示例

    这篇文章主要介绍了Python基于回溯法子集树模板解决找零问题,简单描述了找零问题并结合具体实例形式分析了Python使用回溯法子集树模板解决找零问题的步骤、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • 基于python实现usb热插拔检测

    基于python实现usb热插拔检测

    这篇文章主要为大家详细介绍了如何使用Python实现用于在Linux系统中监测USB设备的热插拔,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-05-05

最新评论