关于如何把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编程实现三维飘雪效果示例过程,通过本示例你可以自己做出一个浪漫的雪花飘落效果,有需要的朋友可以借鉴参考下
    2021-10-10
  • Python爬虫爬取微信朋友圈

    Python爬虫爬取微信朋友圈

    这篇文章主要介绍了Python爬虫爬取微信朋友圈的方法,文中讲解非常细致,帮助大家更好的理解和学习Python爬虫,感兴趣的朋友可以了解下
    2020-08-08
  • Python使用PyNmap进行网络扫描的详细步骤

    Python使用PyNmap进行网络扫描的详细步骤

    使用 PyNmap 进行网络扫描是一个非常有效的方式,PyNmap 是 Nmap 工具的一个 Python 封装,它允许你在 Python 脚本中使用 Nmap 的强大功能,本文介绍了如何使用 PyNmap 进行网络扫描的详细步骤,需要的朋友可以参考下
    2024-08-08
  • python实现socket简单通信的示例代码

    python实现socket简单通信的示例代码

    这篇文章主要介绍了python实现socket简单通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python可变参数函数用法实例

    Python可变参数函数用法实例

    这篇文章主要介绍了Python可变参数函数用法,实例分析了Python可变参数函数的定义与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 一文详解如何从Python直接导入C++代码文件

    一文详解如何从Python直接导入C++代码文件

    通过结合cppimport、pybind11和cffi的力量,开发人员可以直接在Python中集成现有的C/C++库或编写关键性能函数,从而提升应用程序性能并提高开发生产力,下面小编就和大家介绍一下具体步骤吧
    2026-03-03
  • Tensorflow 2.1完成对MPG回归预测详解

    Tensorflow 2.1完成对MPG回归预测详解

    这篇文章主要为大家介绍了Tensorflow 2.1完成对MPG回归预测详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Pycharm打印大数据文件显示不全的解决方法

    Pycharm打印大数据文件显示不全的解决方法

    这篇文章主要介绍了Pycharm打印大数据文件显示不全的解决方法,昨晚写了个小爬虫,简单分析下发现可以修改请求的url,直接获取所有目标的数据,想先打印在控制台看看,发现打印的数据不全,所以本文记录了一下解决方法,需要的朋友可以参考下
    2024-03-03
  • Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))

    Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))

    这篇文章主要介绍了Pycharm使用远程linux服务器conda/python环境在本地运行的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • 8个Python中批量处理数据的核心库使用指南

    8个Python中批量处理数据的核心库使用指南

    处理数据的时候,我发现 Excel 有时候不好用,不是说它的功能不好用,而是它的隐形转换和不可复现输在起跑线上了,所以本文整理了一套 Python 工具栈,有需要的小伙伴可以了解下
    2026-01-01

最新评论