关于如何把Python对象存储为文件的方法详解

 更新时间:2024年01月25日 11:32:26   作者:微小冷  
本文将给大家介绍如何把Python对象存储为文件的方法,pickle可以用二进制表示并读写python数据,这个功能并不安全,如果把一个pickle暴露给别人,有被植入恶意程序的风险,文中通过代码给大家讲解的非常详细,需要的朋友可以参考下

加载和保存

pickle中有两组加载和保存函数

保存加载
交互文件dumpload
交互字节码dumpsloads

例如

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个版本,其中v0v1过于古老,基本没什么能用的地方;v3以后的版本则不再支持Python2,下表列出了自v2v5的一些更新特性

引入版本文档
v2Python 2.3PEP307为 新式类 提供了更高效的封存机制。
v3Python 3.0显式地支持字节对象
为Python 3.0-3.7 的默认协议。
v4Python 3.4PEP 3154支持存储较大对象,并针对数据格式进行了优化
Python 3.8使用的默认协议。
v5Python 3.8PEP 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 实现方阵的对角线遍历示例

    python 实现方阵的对角线遍历示例

    今天小编就为大家分享一篇python 实现方阵的对角线遍历示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 使用seaborn绘制强化学习中的图片问题

    使用seaborn绘制强化学习中的图片问题

    这篇文章主要介绍了使用seaborn绘制强化学习中的图片问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Python 实现将大图切片成小图,将小图组合成大图的例子

    Python 实现将大图切片成小图,将小图组合成大图的例子

    这篇文章主要介绍了Python 实现将大图切片成小图,将小图组合成大图的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 简要讲解Python编程中线程的创建与锁的使用

    简要讲解Python编程中线程的创建与锁的使用

    这篇文章主要介绍了简要讲解Python编程中线程的创建与锁的使用,Python中虽然有GIL的存在,但依然是能够创建多个线程来交替使用的,需要的朋友可以参考下
    2016-02-02
  • python捕获异常后继续执行问题

    python捕获异常后继续执行问题

    这篇文章主要介绍了python捕获异常后继续执行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python实现从url中提取域名的几种方法

    Python实现从url中提取域名的几种方法

    这篇文章主要介绍了Python实现从url中提取域名的几种方法,本文给出了3种方法实现在URL中提取域名的需求,需要的朋友可以参考下
    2014-09-09
  • 浅谈Python中的模块

    浅谈Python中的模块

    这篇文章主要介绍了Python中的模块相关知识,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法

    Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法

    这篇文章主要介绍了Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • python多线程中获取函数返回值的三种方法

    python多线程中获取函数返回值的三种方法

    本文主要介绍了python多线程中获取函数返回值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 如何用Django处理gzip数据流

    如何用Django处理gzip数据流

    这篇文章主要介绍了如何用Django处理gzip数据流,帮助大家更好的理解和使用django框架,感兴趣的朋友可以了解下
    2021-01-01

最新评论