详解Python3 pickle模块用法

详解Python3 pickle模块用法

简介

pickle 模块是 Python 中的一个标准库,用来序列化和反序列化 Python 对象。简单来说,pickle 可以将 Python 对象转化为二进制格式,这样可以在不同的程序之间传递数据或者将数据存储到磁盘中,使得这些数据保持其原本的数据类型和结构。

支持的数据类型

在使用 pickle 时需要知道,它支持处理的 Python 数据类型如下:

  • 基本数据类型:intfloatcomplexstrbytes
  • 组合数据类型:listtuplesetdict
  • 自定义类、函数(不支持 lambda 函数)

序列化对象

pickle 库提供了 dumpdumps 两个方法来序列化 Python 对象,二者的区别在于前者将序列化的对象保存到文件中,而后者将序列化的对象保存到一个 Byte 字符串中。

import pickle

# 序列化一个简单的对象
data = [1, 2, 3, 4, 5]
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

# 将序列化的对象保存到一个 Byte 字符串中
data_str = pickle.dumps(data)

以上代码中,先定义了一个列表对象,然后使用 pickle.dump 方法将 data 序列化并保存到文件 data.pkl 中,使用 pickle.dumps 方法将 data 序列化并保存到一个 Byte 字符串中。

反序列化对象

与序列化相对应,pickle 库也提供了 loadloads 两个方法来反序列化 Python 对象。二者的区别在于前者从文件中加载序列化的对象,而后者从一个 Byte 字符串中加载序列化的对象。

import pickle

# 从文件中加载序列化的对象
with open('data.pkl', 'rb') as f:
    data = pickle.load(f)
print(data)

# 从 Byte 字符串中加载序列化的对象
data_str = b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04K\x05e.'
data = pickle.loads(data_str)
print(data)

以上代码中,先使用 pickle.load 方法从文件 data.pkl 中加载序列化的对象,在屏幕输出加载结果;然后使用 pickle.loads 方法从一个 Byte 字符串中加载序列化的对象,在屏幕输出加载结果。

注意

使用 pickle 库时,需要注意以下几点:

  • 不要对不信任的数据使用 pickle.load,因为其可能会执行恶意代码。
  • 序列化的数据跨 Python 版本、操作系统、CPU 架构时,可能会出现不兼容问题。
  • pickle 序列化的数据大小通常比 JSON 格式的数据大。
  • 序列化的数据也可以使用压缩算法来减小其大小,例如 gzip、bz2 等。

示例

下面通过两个示例,来展示 pickle 的具体用法。

示例 1

import pickle


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"Person(name='{self.name}', age={self.age})"


person1 = Person('Tom', 23)

# 把 person1 序列化保存到文件 pers.p
with open('pers.p', 'wb') as f:
    pickle.dump(person1, f)

# 从 pers.p 中读取序列化的 Person 对象并反序列化
with open('pers.p', 'rb') as f:
    person2 = pickle.load(f)
print(person2)

以上示例中,首先定义了一个 Person 类,接着创建了一个类的实例 person1,并使用 pickle.dump 方法将其序列化保存到文件 pers.p 中。接着使用 pickle.load 方法读取文件 pers.p 中序列化的数据并反序列化成 Python 对象 person2,最后输出 person2 的信息。

示例 2

import pickle


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 把二叉树序列化保存到文件 tree.p
with open('tree.p', 'wb') as f:
    pickle.dump(root, f)

# 从 tree.p 中读取序列化的二叉树并反序列化
with open('tree.p', 'rb') as f:
    root_new = pickle.load(f)
print(root_new.val)
print(root_new.left.val)
print(root_new.right.val)
print(root_new.left.left.val)
print(root_new.left.right.val)

以上示例中,首先定义了一个 TreeNode 类表示二叉树的节点,并创建了一个二叉树并使用 pickle.dump 方法将其序列化保存到文件 tree.p 中。接着使用 pickle.load 方法读取文件 tree.p 中序列化的数据并反序列化成 Python 对象 root_new,最后输出 root_new 中的节点信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python3 pickle模块用法 - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • 解决Pyinstaller打包为可执行文件编码错误的问题

    下面我将详细讲解如何解决 Pyinstaller 打包为可执行文件编码错误的问题。 问题描述 在使用 Pyinstaller 进行打包时,会出现编码错误的问题,错误提示类似于: UnicodeEncodeError: ‘charmap’ codec can’t encode character ‘\u4e2d’ in position 0: characte…

    python 2023年5月20日
    00
  • 对NumPy数组进行比较和过滤

    当我们使用NumPy数组时,我们可能面临比较和过滤数据的任务。在本篇攻略中,我将详细介绍如何使用NumPy进行数组比较和数据过滤。 1. 比较数组 可以使用NumPy进行数组比较。当我们使用数组比较时,我们可以比较两个数组中的每个元素。如果两个数组中的元素相同,则返回True,否则返回False。 以下是比较两个数组的示例: import numpy as …

    python-answer 2023年3月25日
    00
  • python实现csdn全部博文下载并转PDF

    下面就为你详细讲解“Python实现CSDN全部博文下载并转PDF”的完整攻略。 1. 准备工作 在开始操作之前,我们需要准备以下工具和库: Python3:需要先安装Python3环境; requests库:用于发送网络请求; BeautifulSoup4库:用于解析HTML页面的内容; pdfkit库:用于将HTML页面转换为PDF文件。 其中,requ…

    python 2023年5月20日
    00
  • 利用Python 实现分布式计算

    利用Python实现分布式计算 什么是分布式计算 分布式计算是指将一个计算任务分成若干个小的计算任务,分配给多个计算节点同时计算,从而实现更快速、更高效地完成计算任务的一种计算方式。它不仅可以大幅提升计算速度,还具有更好的容错性和可伸缩性等优势。 分布式计算的实现方法 利用Python实现分布式计算通常可以采用以下方法: 使用Python自带的multipr…

    python 2023年5月19日
    00
  • Python自动化之定位方法大杀器xpath

    下面是关于“Python自动化之定位方法大杀器xpath”的详细讲解攻略。 什么是Xpath? XPath是一门在XML文档中查找信息的语言。最初的设计目的是用于搜索XML文档的节点,但实际使用过程中,XPath也常常用于HTML页面元素的定位。Python中使用XPath来定位HTML元素非常方便。 XPath的使用方法 语法 XPath是用“路径表达式”…

    python 2023年5月19日
    00
  • python 实现在Excel末尾增加新行

    下面是详细讲解“python实现在Excel末尾增加新行”的完整实例教程: 1. 准备工作 在开始编写代码之前,我们需要先安装一些必要的Python库:- pandas:用于读取和修改Excel文件- openpyxl:用于创建和保存Excel文件 我们可以通过在终端中输入以下命令来安装这两个库: pip install pandas openpyxl 2.…

    python 2023年5月13日
    00
  • opencv python简易文档之图片基本操作指南

    Opencv Python简易文档之图片基本操作指南 本文旨在介绍使用Opencv Python库进行图片处理的基础操作,通过代码实现图片灰度转换、图像缩放、图像平移等基本操作。主要内容包括以下几个方面: 图片读取 图片处理 图片显示 图片读取 Opencv Python库的imread()函数用于读取图片,其参数为文件路径,可读取多种格式的图片文件,如.p…

    python 2023年5月18日
    00
  • python 如何把classification_report输出到csv文件

    将classification_report输出到csv文件需要进行以下步骤: 使用classification_report函数获取分类报告指标 将指标转换成DataFrame类型并设置列名 使用pandas库的to_csv函数将DataFrame保存为csv文件 以下是详细的攻略: 使用classification_report函数获取分类报告指标 cl…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部