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

目录
  • 前言:
  • pickle.dumps()函数
  • pickle.loads()函数
  • pickle.dump()函数
  • pickle.load()函数
  • 总结:

前言:

Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化。也就是说,pickle 可以实现 Python 对象的存储及恢复。

值得一提的是,pickle 是 python 语言的一个标准模块,安装 python 的同时就已经安装了 pickle 库,因此它不需要再单独安装,使用 import 将其导入到程序中,就可以直接使用。

pickle 模块提供了以下 4 个函数供我们使用:

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

以上这 4 个函数可以分成两类,其中 dumps loads 实现基于内存的 Python 对象与二进制互转;dump 和 load 实现基于文件的 Python 对象与二进制互转。

pickle.dumps()函数

此函数用于将 Python 对象转为二进制对象,其语法格式如下:

dumps(obj, protocol=None, *, fix_imports=True)

此格式中各个参数的含义为:

  • obj:要转换的 Python 对象;
  • protocol:pickle 的转码协议,取值为 0、1、2、3、4,其中 0、1、2 对应 Python 早期的版本,3 和 4 则对应 Python 3.x 版本及之后的版本。未指定情况下,默认为 3。
  • 其它参数:为了兼容 Python 2.x 版本而保留的参数,Python 3.x 中可以忽略。

【例 1】

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
p1 = pickle.dumps(tup1)
print(p1)

输出结果为:

b'\x80\x03X\r\x00\x00\x00I love Pythonq\x00cbuiltins\nset\nq\x01]q\x02(K\x01K\x02K\x03e\x85q\x03Rq\x04N\x87q\x05.'

pickle.loads()函数

此函数用于将二进制对象转换成 Python 对象,其基本格式如下:

loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')

其中,data 参数表示要转换的二进制对象,其它参数只是为了兼容 Python 2.x 版本而保留的,可以忽略。

【例 2】在例 1 的基础上,将 p1 对象反序列化为 Python 对象。

import pickle
tup1 = ('I love Python', {1,2,3}, None)
p1 = pickle.dumps(tup1)
#使用 loads() 函数将 p1 转成 Python 对象
t2 = pickle.loads(p1)
print(t2)

运行结果为:

('I love Python', {1, 2, 3}, None)

注意:在使用 loads() 函数将二进制对象反序列化成 Python 对象时,会自动识别转码协议,所以不需要将转码协议当作参数传入。并且,当待转换的二进制对象的字节数超过 pickle 的 Python 对象时,多余的字节将被忽略。

pickle.dump()函数

此函数用于将 Python 对象转换成二进制文件,其基本语法格式为:

dump (obj, file,protocol=None, *, fix mports=True)

其中各个参数的具体含义如下:

  • obj:要转换的 Python 对象。
  • file:转换到指定的二进制文件中,要求该文件必须是以"wb"的打开方式进行操作。
  • protocol:和 dumps() 函数中 protocol 参数的含义完全相同,因此这里不再重复描述。
  • 其他参数:为了兼容以前 Python 2.x版本而保留的参数,可以忽略。

【例 3】将 tup1 元组转换成二进制对象文件。

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open ("a.txt", 'wb') as f: #打开文件
    pickle.dump(tup1, f) #用 dump 函数将 Python 对象转成二进制对象文件

运行完此程序后,会在该程序文件同级目录中,生成 a.txt 文件,但由于其内容为二进制数据,因此直接打开会看到乱码。

pickle.load()函数

此函数和 dump() 函数相对应,用于将二进制对象文件转换成 Python 对象。该函数的基本语法格式为:

load(file, *, fix_imports=True, encoding='ASCII', errors='strict')

其中,file 参数表示要转换的二进制对象文件(必须以 "rb" 的打开方式操作文件),其它参数只是为了兼容 Python 2.x 版本而保留的参数,可以忽略。

【例 4】将例 3 转换的 a.txt 二进制文件对象转换为 Python 对象。

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open ("a.txt", 'wb') as f: #打开文件
    pickle.dump(tup1, f) #用 dump 函数将 Python 对象转成二进制对象文件
with open ("a.txt", 'rb') as f: #打开文件
    t3 = pickle.load(f) #将二进制文件对象转换成 Python 对象
    print(t3)

运行结果为:

('I love Python', {1, 2, 3}, None)

总结:

看似强大的 pickle 模块,其实也有它的短板,即 pickle 不支持并发地访问持久性对象,在复杂的系统环境下,尤其是读取海量数据时,使用 pickle 会使整个系统的I/O读取性能成为瓶颈。这种情况下,可以使用 ZODB。

ZODB 是一个健壮的、多用户的和面向对象的数据库系统,专门用于存储 Python 语言中的对象数据,它能够存储和管理任意复杂的 Python 对象,并支持事务操作和并发控制。并且,ZODB 也是在 Python 的序列化操作基础之上实现的,因此要想有效地使用 ZODB,必须先学好 pickle。

到此这篇关于Python pickle模块实现Python对象持久化存储的文章就介绍到这了,更多相关Python 持久化存储内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python使用pickle模块存储数据报错解决示例代码

    本文研究的主要是Python使用pickle模块存储数据报错解决方法,以代码的形式展示,具体如下. 首先来了解下pickle模块 pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化, pickle序列化后的数据,可读性差,人一般无法识别. 接下来我们看下Python使用pickle模块存储数据报错解决方法. 代码: # 写入错误 TypeEr

  • python数据持久存储 pickle模块的基本使用方法解析

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

  • 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模块

    目录 前言 一.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类库介绍(对象序列化和反序列化)

    一.pickle pickle模块用来实现python对象的序列化和反序列化.通常地pickle将python对象序列化为二进制流或文件.   python对象与文件之间的序列化和反序列化: 复制代码 代码如下: pickle.dump() pickle.load() 如果要实现python对象和字符串间的序列化和反序列化,则使用: 复制代码 代码如下: pickle.dumps() pickle.loads() 可以被序列化的类型有: * None,True 和 False; * 整数,浮点数

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

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

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

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

  • python中IO流和对象序列化详解

    目录 一.IO流的操作 二.对象序列化 总结 一.IO流的操作 (1).什么是IO流(Input Output Stream)?IO流说的主要是计算机的输入和输出操作.常见的IO操作,一般说的是内存.IO流是一种常见的持久化(永久保存)技术:将数据从内存输出到磁盘保存下来.(2).IO流的分类根据数据流动(站在内存的角度上来说):输入流.输出流根据数据的类型:字符流.字节流注:字符流:字符只能操作有字符的数据(读到末尾是’’)字节流:字节是可以操作一切数据的(读到末尾是b’’),字节流操作大数据

随机推荐