栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

文件5:pickle模块-Python对象序列化

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

文件5:pickle模块-Python对象序列化

目录

1. pickle函数模块基础

2. pickle.dump()

3. pickle.load()

4. pickle.dumps()、pickle.loads()


1. pickle函数模块基础

官方说明:

模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化。 "pickling" 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 "unpickling" 是相反的操作,会将(来自一个 binary file 或者 bytes-like object 的)字节流转化回一个对象层次结构。 pickling(和 unpickling)也被称为“序列化”, “编组” 1 或者 “平面化”。而为了避免混乱,此处采用术语 “封存 (pickling)” 和 “解封 (unpickling)”。

常用的文件操作方法,是针对字符串的,如要对数值进行存储读取,可以使用 int()、float() 对象;但列表、字典、类等更为复杂的数据类型的处理则会非常复杂。此时,如要对其他Python对象进行存储和读取,应用 pickle 模块执行是一个好的选择。

需要注意的是 pickle 所使用的数据格式仅可用于 Python,这意味着非 Python 程序可能无法重新读取 pickle 封存的 Python 对象。此时根据具体需要可以考虑使用 json、csv 模块等,json 模块参见:《文件6:json模块》

2. pickle.dump()

将对象 obj 封存以后的对象写入已打开的 file object file。

函数结构如下:

pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)

各参数说明如下:

  • 参数 file 必须有一个 write() 方法,该 write() 方法要能接收字节作为其唯一参数。因此,它可以是一个打开的磁盘文件(用于写入二进制内容),也可以是一个 io.BytesIO 实例,也可以是满足这一接口的其他任何自定义对象。
  • 如果 fix_imports 为 True 且 protocol 小于 3,pickle 将尝试将 Python 3 中的新名称映射到 Python 2 中的旧模块名称,因此 Python 2 也可以读取封存的数据流。
  • 如果 buffer_callback 为 None(默认情况),缓冲区视图(buffer view)将会作为 pickle 流的一部分被序列化到 file 中。
  • 如果 buffer_callback 不为 None,那它可以用缓冲区视图调用任意次。如果某次调用返回了 False 值(例如 None),则给定的缓冲区是 带外的,否则缓冲区是带内的(例如保存在了 pickle 流里面)。
  • 如果 buffer_callback 不是 None 且 protocol 是 None 或小于 5,就会出错。

执行完 .dump() 函数后,仍需要执行 f.close()、f.flush() 来保存文件缓冲区中写入内容;

多个数值一次写入,可以将多个数值合并为元组;

保存的文件需要通过二进制方式打开,否则之后读取报错;

后缀名可以为任意值,建议使用 .pkl 或 .pickle 方便记忆。

import pickle

#二进制模式打开文件f
f = open(r'D:PycharmProject测试文件test.pkl','wb+')
f.read()
b''

#准备多种Python类型数据
list1 = [1,'23',(4,5),range(6)]
dic1 = {'a':1234,'中文':(5,6,7)}
int1 = 0
float1 = 3.14
plural1 = -1.5 + 2j

#通过元组,一次写多个数值
pickle.dump((list1,dic1,int1,float1,plural1),f)

#未做存储,读取数据为空
f.read()
b''
f.close()

#通过二进制模式打开文件f,读取成功
f = open(r'D:PycharmProject测试文件test.pkl','rb+')
pickle.load(f)
([1, '23', (4, 5), range(0, 6)], {'a': 1234, '中文': (5, 6, 7)}, 0, 3.14, (-1.5+2j))
f.seek(0)
0
f.read()
b'x80x04x95x7fx00x00x00x00x00x00x00(]x94(Kx01x8cx0223x94Kx04Kx05x86x94x8cx08builtinsx94x8cx05rangex94x93x94Kx00Kx06Kx01x87x94Rx94e}x94(x8cx01ax94Mxd2x04x8cx06xe4xb8xadxe6x96x87x94Kx05Kx06Kx07x87x94uKx00G@tx1exb8Qxebx85x1fhx03x8cx07complexx94x93x94Gxbfxf8x00x00x00x00x00x00G@x00x00x00x00x00x00x00x86x94Rx94tx94.'

#不通过二进制模式打开文件f,读取失败
f = open(r'D:PycharmProject测试文件test.pkl','r+')
f.read()
Traceback (most recent call last):
  File "", line 1, in 
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 0: illegal multibyte sequence
pickle.load(f)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: a bytes-like object is required, not 'str'

3. pickle.load()

从已打开的 file object 文件 中读取封存后的对象,重建其中特定对象的层次结构并返回。

函数结构如下:

pickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict', buffers=None)

通过 pickle.load() 读取文件,文件需要通过二进制模式打开,否则报错;

通过元组方式写入的多个参数,可以通过元组解包的方式读取。

#二进制模式打开文件f
f = open(r'D:PycharmProject测试文件test.pkl','wb+')
f.read()
b''

#通过元组,一次写多个数值
list1 = [1,'23',(4,5),range(6)]
dic1 = {'a':1234,'中文':(5,6,7)}
int1 = 0
float1 = 3.14
plural = -1.5 + 2j
plural1 = -1.5 + 2j
pickle.dump((list1,dic1,int1,float1,plural1),f)

#通过元组解包方式读取多个参数
i1,i2,i3,i4,i5 = pickle.load(f)
print(i1,i2,i3,i4,i5,sep='n')
[1, '23', (4, 5), range(0, 6)]
{'a': 1234, '中文': (5, 6, 7)}
0
3.14
(-1.5+2j)

4. pickle.dumps()、pickle.loads()

pickle.dumps():将 obj 封存以后的对象作为 bytes 类型直接返回,而不是将其写入到文件。

函数结构如下:

pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)

pickle.loads():重建并返回一个对象的封存表示形式 data 的对象层级结构。 data 必须为 bytes-like object。

函数结构如下:

pickle.loads(data, /, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

通过上述两个函数直接对 Python 对象做二进制类型数据生成和读取,但不做文件存储,示例如下:

#准备多种Python类型数据
list1 = [1,'23',(4,5),range(6)]
dic1 = {'a':1234,'中文':(5,6,7)}
int1 = 0
float1 = 3.14
plural = -1.5 + 2j
plural1 = -1.5 + 2j

fb = pickle.dumps((list1,dic1,int1,float1,plural1))
fb
b'x80x04x95x7fx00x00x00x00x00x00x00(]x94(Kx01x8cx0223x94Kx04Kx05x86x94x8cx08builtinsx94x8cx05rangex94x93x94Kx00Kx06Kx01x87x94Rx94e}x94(x8cx01ax94Mxd2x04x8cx06xe4xb8xadxe6x96x87x94Kx05Kx06Kx07x87x94uKx00G@tx1exb8Qxebx85x1fhx03x8cx07complexx94x93x94Gxbfxf8x00x00x00x00x00x00G@x00x00x00x00x00x00x00x86x94Rx94tx94.'

pickle.loads(fb)
([1, '23', (4, 5), range(0, 6)], {'a': 1234, '中文': (5, 6, 7)}, 0, 3.14, (-1.5+2j))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935356.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号