用来将对象持久化的python pickle模块

目录
  • 前言
  • 一、pickle 模块下的方法
    • 1. dumps()
    • 2. loads()
    • 3. dump()
    • 4. load()
  • 二、可以被 pickle 封存/解封的对象
  • 三、pickle 与 json 的区别

前言

pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了,就是它能够实现任意对象与二进制直接的相互转化,也可以实现对象与文本之间的相互转化。

比如,我程序里有一个 python 对象,我想把它存到磁盘里,于是我用 pickle 把他转到一个文本里。当后面我想使用的时候,读取出来时候依然是一个 python 对象。

一、pickle 模块下的方法

pickle 模块提供了以下 4 种方法:

  • dump():将 Python 中的对象序列化成二进制对象,并写入文件
  • load():读取指定的序列化数据文件,并返回对象
  • dumps():将 Python 中的对象序列化成二进制对象,并直接返回,而不是将其写入到文件
  • loads():读取给定的二进制对象数据,并将其转换为 Python 对象

1. dumps()

将 Python 中的对象序列化成二进制对象,并直接返回。

示例

import pickle
test_list = ["pingguo", {1, 2, 3}, None]
# 使用 dumps() 函数将 test_list 转成 p1
p1 = pickle.dumps(test_list)
print(p1)
print("返回类型:", type(p1))

输出结果:

b'\x80\x03]q\x00(X\x07\x00\x00\x00pingguoq\x01cbuiltins\nset\nq\x02]q\x03(K\x01K\x02K\x03e\x85q\x04Rq\x05Ne.'
返回类型: <class 'bytes'>

2. loads()

读取给定的二进制对象数据,并将其转换为 Python 对象。

示例在上面的基础上继续:

import pickle
test_list = ["pingguo", {1, 2, 3}, None]
# 使用 dumps() 函数将 test_list 转成 p1
p1 = pickle.dumps(test_list)
print(p1)
print("返回类型:", type(p1))
# 使用 loads() 函数将 p1 转成 Python 对象 p2
p2 = pickle.loads(p1)
print(p2)
print("返回类型:", type(p2))

输出结果:

b'\x80\x03]q\x00(X\x07\x00\x00\x00pingguoq\x01cbuiltins\nset\nq\x02]q\x03(K\x01K\x02K\x03e\x85q\x04Rq\x05Ne.'
返回类型: <class 'bytes'>
['pingguo', {1, 2, 3}, None]
返回类型: <class 'list'>

pickle 反序列化后的对象与原对象是等值的副本对象,类似deepcopy。

3. dump()

将 Python 中的对象序列化成二进制对象,并写入文件。

示例

import pickle
test_list = ["pingguo", {1, 2, 3}, None]
with open("test_pickle.txt", "wb") as f:
    # 使用 dump() 函数将 test_list 转成 p1,写到txt文本里
    pickle.dump(test_list, f)

注意这里的写文件是 "wb",以二进制格式打开一个文件只用于写入,否则会报错。

执行成功后,同级目录下生成一个test_pickle.txt文件,因为是二进制内容,直接打开看到的是乱码。

4. load()

读取指定的序列化数据文件,并返回对象。

示例

import pickle
test_list = ["pingguo", {1, 2, 3}, None]
with open("test_pickle.txt", "wb") as f:
    # 使用 dump() 函数将 test_list 转成 p1,写到txt文本里
    pickle.dump(test_list, f)
with open("test_pickle.txt", "rb") as f:
    # 将二进制文件对象转换成 Python 对象 p3
    p3 = pickle.load(f)
    print(p3)
    print("类型:", type(p3))

注意,这里读取文件用rb,也就是以二进制格式打开一个文件用于只读。

执行成功。

['pingguo', {1, 2, 3}, None]
类型: <class 'list'>

二、可以被 pickle 封存/解封的对象

下列类型可以被封存:

  • None、True 和 False
  • 整数、浮点数、复数
  • str、byte、bytearray
  • 只包含可封存对象的集合,包括 tuple、list、set 和 dict
  • 定义在模块最外层的函数(使用 def 定义,lambda 函数则不可以)
  • 定义在模块最外层的内置函数
  • 定义在模块最外层的类
  • 某些类实例,这些类的 dict 属性值或 getstate() 函数的返回值可以被封存。

三、pickle 与 json 的区别

python 提供的 json 标准库相信大家都熟悉,提供的方法也与 pickle 相似,那么两者有什么区别呢?

  • JSON 是一个文本序列化格式,pickle 是一个二进制序列化格式。
  • JSON 是我们可以直观阅读的,而 pickle 不行。
  • JSON是可互操作的,在Python之外也可以使用,而pickle则是Python专用的。
  • 默认情况下,JSON 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型。
  • JSON不像 pickle,对一个不信任的JSON进行反序列化的操作本身不会造成任意代码执行漏洞。

关于最后一点,说的是 pickle 模块并不安全。很有可能你去解封的是恶意构建的 pickle 数据,造成解封时执行了恶意代码,所以要慎用。

以上就是用来将对象持久化的python pickle模块的详细内容,更多关于python对象持久化pickle模块的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python序列化模块之pickle与json详解

    目录 序列化模块 序列化和反序列化 使用场景 dumps & loads dump & load JSON序列化模块 使用场景 支持的数据类型 JSON和pickle的区别 序列化函数 json和pickle实际使用过程中的一些问题 pickle和json的区别总结 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化.把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化. 在文件中存储的数据只能是字符串,或者是字节流,不

  • Python3 pickle模块的使用方法详细介绍

    pickle模块特点 1.只能在python中使用,只支持python的基本数据类型. 2.可以处理复杂的序列化语法.(例如自定义的类的方法,游戏的存档等) 3.序列化的时候,只是序列化了整个序列对象,而不是内存地址. pickle: 用于python特有的类型和python的数据类型间进行转换,pickle提供四个功能:dumps,dump,loads,load pickle可以存储什么类型的数据呢? 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None. 由任何

  • Python中的数据对象持久化存储模块pickle的使用示例

    Python中可以使用 pickle 模块将对象转化为文件保存在磁盘上,在需要的时候再读取并还原.具体用法如下: pickle是Python库中常用的序列化工具,可以将内存对象以文本或二进制格式导出为字符串,或者写入文档.后续可以从字符或文档中还原为内存对象.新版本的Python中用c重新实现了一遍,叫cPickle,性能更高. 下面的代码演示了pickle库的常用接口用法,非常简单: import cPickle as pickle # dumps and loads # 将内存对象dump为

  • Python pickle模块实现Python对象持久化存储

    目录 前言: pickle.dumps()函数 pickle.loads()函数 pickle.dump()函数 pickle.load()函数 总结: 前言: Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化.也就是说,pickle 可以实现 Python 对象的存储及恢复. 值得一提的是,pickle 是 python 语言的一个标准模块,安装 python 的同时就已经安装了 pickle 库,因此它不需要再

  • Python pickle模块常用方法代码实例

    用于序列化的两个模块 json:用于字符串和Python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 json提供四个功能:dumps,dump,loads,load pickle提供四个功能:dumps,dump,loads,load pickle可以存储什么类型的数据呢? 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None. 由任何原生类型组成的列表,元组,字典和集合. 函数,类,类的实例 pickle模块中

  • Python 解析库json及jsonpath pickle的实现

    1. 数据抽取的概念 2. 数据的分类 3. JSON数据概述及解析 3.1 JSON数据格式 3.2 解析库json json模块是Python内置标准库,主要可以完成两个功能:序列化和反序列化.JSON对象和Python对象映射图如下: 3.2.1 json序列化 对象(字典/列表) 通过 json.dump()/json.dumps() ==> json字符串.示例代码如下: import json class Phone(object): def __init__(self, name,

  • 用来将对象持久化的python pickle模块

    目录 前言 一.pickle 模块下的方法 1. dumps() 2. loads() 3. dump() 4. load() 二.可以被 pickle 封存/解封的对象 三.pickle 与 json 的区别 前言 pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化.说白了,就是它能够实现任意对象与二进制直接的相互转化,也可以实现对象与文本之间的相互转化. 比如,我程序里有一个 python 对象,我想把它存到磁盘里,于是我用 pickle 把他转到一个文本里.当后面

  • Python pickle模块实现对象序列化

    这篇文章主要介绍了Python pickle模块实现对象序列化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 作用 对Python对象进行序列化,便于存储和传输 Python对象序列化成bytes类型 pickle.dumps(obj) 将Python对象转化为bytes类型 pickle.loads(str) 将转化成的bytes类型数据还原成对象 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 0

  • Python pickle模块用法实例分析

    本文实例讲述了Python pickle模块用法.分享给大家供大家参考.具体分析如下: pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. pickle.dump(obj, file[, protocol]) 序列化对象,并将结果数据流写入到文件对象中.参数protocol是序列化模式,默认值为0,表示以文本的形式序列化.protocol的值还可以是1或2,表示以二进制的形式序列化. pickle.load(file) 反序列化对象.将文件中的数据解析为一个Python

  • Python pickle模块用法实例

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象. 基本接口: 复制代码 代码如下: pickle.dump(obj, file, [,protocol]) 注解:将对象obj保存到文件file中去. protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示:1:老式的二进制

  • 从零学python系列之浅谈pickle模块封装和拆封数据对象的方法

    封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节流转化为Python数据对象,不要从不收信任的数据源中拆封数据.可以封装和拆封几乎任何Python数据对象,主要包括: None , True,False    整数,浮点数,复数    字符串,字节,ByteArray对象    元组,列表,集合,包含可封装对象的字典    在一个模块的顶层定义的函数    在一个模块的顶层定义的内置函数    那是在一个模块的顶层定义的类    __dict_

  • python持久性管理pickle模块详细介绍

    持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象.通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识.另外,还会让您更深一步地了解Python 的对象序列化能力. 什么是持久性? 持 久性的基本思想很简单.假定有一个 Python 程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项).换句话说,您希望将对象存储在磁盘上,便于 以后检索.这就是持久性.要达到这个目

  • Python序列化pickle模块使用详解

    用于序列化的两个模块 json:用于字符串和Python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 json提供四个功能:dumps,dump,loads,load pickle提供四个功能:dumps,dump,loads,load pickle可以存储什么类型的数据呢? 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None. 由任何原生类型组成的列表,元组,字典和集合. 函数,类,类的实例 pickle模块中

随机推荐