关于如何把Python对象存储为文件的方法详解
加载和保存
pickle
中有两组加载和保存函数
保存 | 加载 | |
---|---|---|
交互文件 | dump | load |
交互字节码 | dumps | loads |
例如
x = [i**2 for i in range(10)] import pickle s = pickle.dumps(x) print(s) # b'\x80\x04\x95\x19\x00\x00\x00\x00\x00\x00\x00]\x94(K\x00K\x01K\x04K\tK\x10K\x19K$K1K@KQe.' with open("test.pickle", 'wb') as f: pickle.dump(x, f) # 将x存为f
将x
存储为文件之后,还可以重新打开
with open("test.pickle", 'rb') as f: y = pickle.load(f) print(y) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意事项
除了不够安全之外,使用pickle另外一个需要注意的是,到目前为止,pickle已经有6个版本,其中v0和v1过于古老,基本没什么能用的地方;v3以后的版本则不再支持Python2,下表列出了自v2到v5的一些更新特性
引入版本 | 文档 | ||
---|---|---|---|
v2 | Python 2.3 | PEP307 | 为 新式类 提供了更高效的封存机制。 |
v3 | Python 3.0 | 显式地支持字节对象 为Python 3.0-3.7 的默认协议。 | |
v4 | Python 3.4 | PEP 3154 | 支持存储较大对象,并针对数据格式进行了优化 Python 3.8使用的默认协议。 |
v5 | Python 3.8 | PEP 574 | 增加对带外数据的支持,并可加速带内数据处理 |
理论上讲,pickle
可以封装一切python对象,所以对于一些比较耗时的算法,可以通过pickle
来保存当前的状态。但要注意,尽管pickle
可以封存函数,但并不能封存匿名函数
test = lambda x : x s = pickle.dumps(test) # 报错 def test(x): print(x) s = pickle.dumps(test) print(s) #b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x04test\x94\x93\x94.'
copyreg
python标准库中还提供了copyreg模块,可以注册一个封存函数,在对某个对象进行封存时可调用。示例如下
import copyreg, pickle class C: def __init__(self, a): self.a = a def pickle_c(c): print("您封存了一个C对象") return C, (c.a,) copyreg.pickle(C, pickle_c) c = C(1) p = pickle.dumps(c) # 您封存了一个C对象
在通过copyreg.pickle对类型C注册函数pickle_c之后,再去用pickle.dumps对c的对象进行封存,就会调用pickle_c,从而打印出预设的字符串。
在copyreg.pickle中注册的函数,必须返回一个字符串或包含二至六个元素的元组。
命令行工具
python标准库还提供了pickle的命令行工具,调用格式如下,其中x.pickle是一个封装了python对象的二进制文件。
python -m pickle x.pickle
常见的命令行选项如下表
指令 | 说明 | |
---|---|---|
-a | –annotate | 使用简短的操作码描述来标注每一行。 |
-o | –output=<file> | 输出应当写入到的文件名称。 |
-l | –indentlevel=<num> | 一个新的 MARK 层级所需缩进的空格数。 |
-m | –memo | 当反汇编多个对象时,保留各个反汇编的备忘记录。 |
-p | –preamble=<preamble> | 当指定一个以上的 pickle 文件时,在每次反汇编之前打印给定的前言。 |
以上就是关于如何把Python对象存储为文件的方法详解的详细内容,更多关于Python对象存储为文件的资料请关注脚本之家其它相关文章!
相关文章
对Python中DataFrame选择某列值为XX的行实例详解
今天小编就为大家分享一篇对Python中DataFrame选择某列值为XX的行实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2019-01-01python内存监控工具memory_profiler和guppy的用法详解
这篇文章主要介绍了python内存监控工具memory_profiler和guppy的用法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-07-07
最新评论