Python pickle模块实现对象序列化

Python中的pickle模块可以将Python对象序列化为二进制流,并在需要时反序列化回原始对象。pickle模块广泛应用于 Python 中可用于本地存储或远程传输数据对象。本文将详细介绍Python pickle模块的使用。

序列化数据

在Python中,要使用pickle模块对对象进行序列化,需要导入pickle模块。标准的pickle模块提供了四个方法:dumps, dump,loads 和 load,用于序列化和反序列化 Python 对象。

对象序列化

dumps() 方法将 Python 对象序列化为二进制格式的字符串。以下示例展示了如何使用 "dumps" 将 Python 数据序列化为二进制流:

import pickle
data = {'name': 'Alice', 'age': 31, 'city': 'New York'}
serialized_data = pickle.dumps(data)
print(serialized_data)

输出结果如下,这是二进制的数据:

b'\x80\x04\x95!\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05Alice\x94\x8c\x03age\x94K\x1f\x8c\x04city\x94\x8c\x08New York\x94u.'

文件序列化

pickle 还提供了"dump"方法将序列化后的数据写入文件中,使用以下代码:

import pickle
data = {'name': 'Alice', 'age': 31, 'city': 'New York'}
filename = 'data.pkl'
with open(filename, 'wb') as f:
    pickle.dump(data, f)

对象反序列化

loads() 方法将二进制格式的字符串反序列化回原始 Python 对象。以下示例展示了如何将 "dumps" 输出的二进制二进制数据还原为 Python 对象:

import pickle
data = {'name': 'Alice', 'age': 31, 'city': 'New York'}
serialized_data = pickle.dumps(data)
deserialized_data = pickle.loads(serialized_data)
print(deserialized_data)

输出结果如下:

{'name': 'Alice', 'age': 31, 'city': 'New York'}

文件反序列化

load() 方法从文件中读取序列化后的数据,并将其转换为 Python 对象。使用以下代码:

import pickle
filename = 'data.pkl'
with open(filename, 'rb') as f:
    data = pickle.load(f)
print(data)

在反序列化时需要注意,该对象的类必须存在于程序的命名空间中,否则将抛出 ClassNotFoundException。

常见问题

pickle 安全问题

pickle 的默认行为可能会导致安全问题。由于 pickle 可以从任何可读数据的字符串中反序列化 Python 对象,因此攻击者可以通过包含恶意代码的消息或数据对 pickle 反序列化进行攻击。为了缓解此风险,pickle 模块提供了另外一种更安全的方法。

import pickle
data = {'name': 'Alice', 'age': 31, 'city': 'New York'}
serialized_data = pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
print(serialized_data)

HIGHEST_PROTOCOL 会选择最高有效协议版本,该版本更安全。

pickle 兼容性

pickle 格式不同版本之间不能兼容。反序列化时,我们需要确保序列化和 反序列化使用相同的pickle版本。否则可能会出现UnpicklingError。

为了解决这个问题,Python3.0 提供了新模块 "pickle" (在 python 中增加了一个基于新 pickle 协议的叫做"pickle"),可以兼容Python 2.4 及以下版本的格式,同时也支持 Python 3.0 以上的版本。通过以下代码可以导入新模块:

import pickle5 as pickle

在 Python 3.0 以上版本中,该模块可用。在 Python 2.x 版本中需要安装 pickle5 库。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python pickle模块实现对象序列化 - Python技术站

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

相关文章

  • 浅谈Python的正则表达式

    浅谈Python的正则表达式 正则表达式是一种用于描述字符串模式的语言,它可以用于匹配、查找、替换和割字符串。Python中的re模块提供正则表达式支持,方便进行字符串的处理。本文将浅Python的正则表达式,包括正则表达式语法、re模块的常用函数以及两个常用的匹配实例。 正则表达式语法 正表达式由一些特殊字符和普通字符组成,用于字符串模式。下面是一些常正则…

    python 2023年5月14日
    00
  • Python:分层切片

    【问题标题】:Python: Hierarchical SlicingPython:分层切片 【发布时间】:2023-04-04 03:45:01 【问题描述】: 是否有更 Pythonic/numpythonic 的方式来进行某种嵌套/分层切片,即更漂亮的版本: _sum = 0 for i in np.arange(n): _sum += someFun…

    Python开发 2023年4月6日
    00
  • 为什么 python virtualenv 命令在 Windows 10 上失败?

    【问题标题】:Why is the python virtualenv command failing on Windows 10?为什么 python virtualenv 命令在 Windows 10 上失败? 【发布时间】:2023-04-01 03:30:01 【问题描述】: 我使用的是 Windows 10。我已经能够使用 pip 安装 virtu…

    Python开发 2023年4月8日
    00
  • python出现”IndentationError: unexpected indent”错误解决办法

    当我们在Python编程过程中遇到“IndentationError: unexpected indent”错误提示时,通常是由于缩进不正确导致的。以下是解决Python错误提示“IndentationError: unexpected”的完整攻略: 1. 检查缩进 如果我们在Python编程过程中遇到“IndentationError: unexpecte…

    python 2023年5月13日
    00
  • 基于Python实现的恋爱对话小程序详解

    基于Python实现的恋爱对话小程序详解 简介 本文讲解如何使用Python编写一个简单的恋爱对话小程序,用户可以随意选择角色性别,进行简单的对话交流。 准备工作 首先,你需要安装Python环境,推荐使用Python 3.6及以上版本。其次,你需要安装几个必要的模块,包括random和time。 import random import time 编写代码…

    python 2023年5月23日
    00
  • python自动化实现登录获取图片验证码功能

    下面是Python自动化实现登录获取图片验证码功能的完整攻略。 1.了解网站登录方式 首先,我们要了解一下要登录的网站的登录方式。通常情况下,网站的登录方式有两种: 表单方式:即用户需要通过网页表单提供用户名和密码,才能成功登录。 Cookie方式:即用户访问网站后,网站会在用户的浏览器中设置Cookie信息,当用户再次访问该网站时,可以通过Cookie信息…

    python 2023年5月18日
    00
  • python with statement 进行文件操作指南

    下面是详细讲解“Python with语句进行文件操作指南”的完整攻略。 前置知识 在讲解”Python with语句进行文件操作指南”之前,需要掌握以下基础知识。 with语句 with语句用于处理资源(文件、网络连接、等)的分配和释放,它可以保证在任何情况下,使用完资源后都能正确地释放资源。 语法: with 资源变量 as 目标变量: # 使用资源的代…

    python 2023年6月2日
    00
  • matplotlib.pyplot画图 图片的二进制流的获取方法

    通过使用matplotlib模块的子模块pyplot可以方便地进行数据可视化和绘图。在这个过程中,有时需要将图片作为二进制流的形式获取,以便于后续使用,本篇文章将详细讲解如何获取图片的二进制流。 1. 获取画图对象 在使用pyplot绘图时,我们需要先创建一个画图对象,比如下面的代码: import matplotlib.pyplot as plt plt.…

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