详解Python3 pickle模块用法

yizhihongxing

详解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日

相关文章

  • Python Asyncio 库之同步原语常用函数详解

    Python Asyncio 库之同步原语常用函数详解 1. 异步编程的原理 异步编程是一种非阻塞式的编程方式,它的核心思想就是使用异步函数来代替同步函数,将所有的 I/O 操作交给底层的 I/O 系统处理,以此来提高程序的执行效率和并发性。 Python 中的异步编程由 asyncio 库来实现,它提供了一套完整的异步编程框架,你可以使用它来编写高效的异步…

    python 2023年6月3日
    00
  • Python画图小案例之小雪人超详细源码注释

    Python画图小案例之小雪人超详细源码注释是一篇介绍如何使用Python的turtle库绘制一个小雪人的教程。下面我将详细讲解这个项目的完整攻略,包括安装turtle库、源码讲解以及绘图过程。 安装turtle库 turtle库是Python自带的绘图库,所以无需额外安装。但是如果还没有配置Python环境,请先配置Python环境,具体方法可以参考官方文…

    python 2023年6月6日
    00
  • Python+drawpad实现CPU监控小程序

    下面是详细的Python+drawpad实现CPU监控小程序的攻略: 一、准备工作 1.安装Python环境 首先要安装Python环境,建议选择Python 3.x版本来进行开发。可以从Python官网下载安装包并进行安装。 2.安装drawpad模块 使用drawpad模块需要先安装该模块。可以使用pip命令进行安装,打开终端(或cmd)窗口,输入以下命…

    python 2023年5月18日
    00
  • python解析json串与正则匹配对比方法

    以下是“Python解析JSON串与正则匹配对比方法”的完整攻略: 一、问题描述 在Python中,我们经常需要解析JSON串或使用正则表达式进行匹配。本文将详细讲解Python解析JSON串与正则匹配的对比方法,以及如何在实际开发中选择合适的方法。 二、解决方案 2.1 Python解析JSON串 在Python中,我们可以使用json模块来解析JSON串…

    python 2023年5月14日
    00
  • python实现自动化报表功能(Oracle/plsql/Excel/多线程)

    当然,我很乐意为您讲解Python实现自动化报表功能的完整实例教程。以下是教程的详细步骤: 1. 准备工作 在开始学习和实现自动化报表功能之前,有几个准备工作需要完成。首先,需要安装Oracle数据库和PL/SQLDeveloper。其次,还需要Python编程语言的基本知识,以及对Excel文件格式的了解和掌握。 2. 连接Oracle数据库 在PL/SQ…

    python 2023年5月13日
    00
  • Python聊天室实例程序分享

    下面详细讲解一下Python聊天室实例程序的攻略。 程序介绍 Python聊天室实例程序是利用Python语言编写的一个简单的聊天程序,具有聊天、私信、在线用户列表等常见的聊天功能,该程序适合初学者练手,熟悉网络编程和socket编程。 程序环境 Python聊天室实例程序需要在Python环境下运行,运行环境要求: Python 3.x版本 安装socke…

    python 2023年6月3日
    00
  • 10个Python实现的最频繁使用的聚类算法

    10个Python实现的最频繁使用的聚类算法 聚类算法是一种无监督学习算法,它将数据集中对象分成不同的组或簇,使得同一组内的对象相似度较高,同组之间的对象相似度较低。Python中有许多聚类算法的实现,本文将详细讲解10个Python实现最频繁使用的聚类算法的完整攻略,包括算法原理、Python实现过程和示例说明。 1. K-Means算法 K-Means算…

    python 2023年5月13日
    00
  • 如何使用Python查询某个列中的最小值?

    以下是如何使用Python查询某个列中的最小值的完整使用攻略。 步骤1:导入模块 在Python中,我们需要导入相应的模块来连接数据库和执行查询操作。以下是导入mysql-connector-python模块的基本语法: import mysql.connector 以下是导入psycopg2模块的基本语法: import psycopg2 步骤2:连接数据…

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