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

相关文章

  • python中zip()函数遍历多个列表方法

    Python中zip()函数遍历多个列表方法 在Python中,zip()函数是一种常用的函数,它可以将多个列表中的元素一一对应地打包成元组然后返回一个可迭代对象。本攻略将细介绍Python中zip()函数遍历多个列表的方法,包括如何使用zip()函数遍历多个列表、如何使用zip()函数将个列表合并等方面。 使用zip()函数遍历多个列表 在Python中,…

    python 2023年5月13日
    00
  • Python浮点数取整、格式化和NaN处理的操作方法

    下面是详细讲解Python浮点数取整、格式化和NaN处理的操作方法的完整攻略。 浮点数取整 Python中有三个常用的函数用来对浮点数进行取整操作,分别是round()、ceil()和floor()。 round() round()函数用于四舍五入取整,语法如下: round(number[, ndigits]) number表示要进行取整的浮点数,ndig…

    python 2023年6月3日
    00
  • Python中命令行参数argparse模块的使用

    一、介绍 Python中有一个很强大的命令行参数解析模块 argparse ,使用 argparse 可以非常方便地解析命令行参数并生成帮助信息。argparse 模块可以自动生成帮助信息,还可以自动检查参数和选项的类型以及输入的值是否合法。 二、基本使用 在使用 argparse 之前,需要先导入 argparse 库: import argparse 接…

    python 2023年6月3日
    00
  • 利用python计算时间差(返回天数)

    下面是利用Python计算时间差(返回天数)的完整攻略。 标准库中的date、datetime模块 Python标准库中有两个模块可以用于处理日期和时间:date模块和datetime模块。其中,datetime模块是在date模块的基础上增加了时间相关的功能。我们可以使用datetime模块中的两个类: datetime.date:表示日期,包含年、月、日…

    python 2023年6月2日
    00
  • Python实战使用XPath采集数据示例解析

    XPath是一种用于在XML和HTML文档中定位元素的语言。在Python中,我们可以使用XPath来采集数据。以下是Python实战使用XPath采集数据示例解析的完整攻略,包含两个示例。 步骤1:安装必要的库 在使用XPath采集数据之前,我们需要先安装必要的库。以下是需要安装的库: lxml:用于解析HTML和XML文档。 可以使用pip命令来安装这些…

    python 2023年5月15日
    00
  • Gauss-Seidel迭代算法的Python实现详解

    下面是详细讲解“Gauss-Seidel迭代算法的Python实现详解”的完整攻略,包括算法原理、Python实现和两个示例。 算法原理 Gauss-Seidel迭代法是一种求解线性方程组的方法,其基本思想是通过不断迭代,逐步逼近方程组的解。算的具体步骤如下: 将线性方程组表示为矩阵形式; 对矩阵进行分解,得下三角矩阵L、对角矩阵D和上三角矩阵U; 将方程表…

    python 2023年5月14日
    00
  • Python即时网络爬虫项目启动说明详解

    Python即时网络爬虫项目启动说明详解 本文介绍如何启动一个基于Python的即时网络爬虫项目,首先,我们需要了解一些基础知识和工具。 基础工具 Python开发环境 网页分析工具:如Chrome开发者工具、Firebug等 第三方Python包:如requests、beautifulsoup4、pandas等 网络爬虫技术基础 网络协议:如HTTP、HT…

    python 2023年6月6日
    00
  • 手把手教你Android全局触摸事件监听

    手把手教你Android全局触摸事件监听 在Android开发中,对于某些需要全局响应的触摸事件,我们需要对整个Activity设置触摸事件监听器。本文将手把手地教你如何在Android中实现全局触摸事件的监听。 实现原理 在Android中,我们可以通过在Activity中重写onTouchEvent()方法来监听触摸事件。onTouchEvent()方法…

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