首页 > 编程语言 >Python中的pickle模块:对象序列化与反序列化

Python中的pickle模块:对象序列化与反序列化

时间:2023-06-21 16:36:31浏览次数:53  
标签:Python pickle 对象 模块 序列化 data

在Python中,对象的序列化和反序列化是一项常见的任务。pickle模块提供了一种简单且强大的方法来实现对象的序列化和反序列化,使得开发者能够方便地将复杂的Python对象转化为字节流并在需要时重新还原。本文将详细介绍pickle模块的使用方法和原理,并探讨其在数据持久化和跨进程通信中的应用。

pickle模块的基本用法

使用pickle模块非常简单。下面是一个基本的示例:

import pickle

# 序列化对象
data = {'name': 'Alice', 'age': 25}
serialized_data = pickle.dumps(data)

# 反序列化对象
deserialized_data = pickle.loads(serialized_data)

# 打印反序列化后的对象
print(deserialized_data)

在上述代码中,我们首先使用pickle.dumps()函数将一个Python对象序列化为字节流,然后使用pickle.loads()函数将字节流反序列化为Python对象。最后,我们打印反序列化后的对象。

pickle模块的工作原理

pickle模块的工作原理是通过将对象转化为字节流来实现序列化,然后通过读取字节流来实现反序列化。在序列化过程中,pickle会递归地遍历对象的所有成员,并将其转化为字节流。在反序列化过程中,pickle会根据字节流的结构重新构建出原始对象。

pickle模块的常见应用场景

数据持久化

pickle模块可用于将Python对象保存到磁盘上的文件中,实现数据的持久化。这对于需要长期存储和读取对象的应用程序非常有用。例如,我们可以将一个复杂的数据结构序列化为字节流,并将其保存到文件中:

import pickle

data = {'name': 'Alice', 'age': 25}

# 将对象序列化并保存到文件
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)

# 从文件中加载并反序列化对象
with open('data.pkl', 'rb') as file:
    deserialized_data = pickle.load(file)

print(deserialized_data)

跨进程通信

pickle模块还可用于实现跨进程通信

,将对象从一个进程传递给另一个进程。通过将对象序列化为字节流,我们可以将其发送到另一个进程,并在接收端重新构建对象。这在分布式系统和并行计算中非常有用。

import pickle
from multiprocessing import Process, Pipe

def worker(conn):
    # 从管道接收对象
    data = conn.recv()

    # 反序列化对象
    deserialized_data = pickle.loads(data)

    print(deserialized_data)

# 创建管道和子进程
parent_conn, child_conn = Pipe()
p = Process(target=worker, args=(child_conn,))
p.start()

# 将对象序列化并发送到子进程
data = {'name': 'Alice', 'age': 25}
serialized_data = pickle.dumps(data)
parent_conn.send(serialized_data)

p.join()

在上述代码中,我们创建了一个管道,并在子进程中接收并反序列化通过管道发送的对象。

pickle模块的注意事项

在使用pickle模块时,需要注意以下几点:

  1. pickle模块仅适用于Python特定的对象,无法序列化其他语言的对象。

  2. 序列化和反序列化过程中,需要保证相应的类和函数定义在两端都是可用的。

  3. 由于pickle模块会执行反序列化时的代码,存在安全风险,因此不要加载来自不可信源的pickle数据。

标签:Python,pickle,对象,模块,序列化,data
From: https://www.cnblogs.com/DTCLOUD/p/17496583.html

相关文章

  • 软件测试|超好用超简单的Python GUI库——tkinter(四)
    前言之前我们介绍了label控件,本篇文章我们将介绍button控件。Button控件是Tkinter中常用的窗口部件之一,同时也是实现程序与用户交互的主要控件。通过用户点击按钮的行为来执行回调函数,是Button控件的主要功用。首先自定义一个函数或者方法,然后将函数与按钮关联起来,最后,当用......
  • 软件测试|超好用超简单的Python GUI库——tkinter(五)
    前言在之前,我们介绍了tkinter的button控件,label控件,今天我们介绍一下entry控件,entry控件我们可以理解为界面的内容输入框,实现GUI界面与用户的信息交互,最典型的场景就是我们在登录时需要输入的账号密码。获取更多技术资料,请点击!Entry控件使用起来非常简单,下面对该控件做简单的......
  • 三秒看懂Python yield
    业务场景:一个FastAPI构建的网关,数据进来时立即给予一次响应,表示:“收到,我已开始执行。”,然后分发任务另起一个线程异步执行。原本代码写的在异步里又起了一个异步等任务执行,这样不影响下面的return立刻响应。逻辑看起很繁琐,那有没有办法,能让函数在"return":“收到”之后,继续执行呢?......
  • python如何用openpyxl 创建表格,写入数据
    1.安装openpyxl库,可以选择豆瓣源,直接可执行,是一次性的.不需要设置.pipinstallopenpyxl-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.com 2.我们这里创建一个表(不是打开本地),并插入数据'sandx'是设置表中单表sheet的标题栏.插入数......
  • python代码-基于深度强化学习的微能源网能量管理与优化策略研究 关键词:微能源网;能量管
    python代码-基于深度强化学习的微能源网能量管理与优化策略研究关键词:微能源网;能量管理;深度强化学习;Q-learning;DQN内容::面向多种可再生能源接入的微能源网,提出一种基于深度强化学习的微能源网能量管理与优化方法。该方法使用深度Q网络(deepQnetwork,DQN)对预测负荷、风光等可......
  • 基于模型强化学习的离网微电网终身控制Python源代码
    基于模型强化学习的离网微电网终身控制Python源代码离网微网的终身控制问题包括两个任务,即对微网设备的状态进行估计和通过预测未来消费量和可再生产量来考虑不确定性的运行规划。有效控制的主要挑战来自于随时间发生的各种变化。提出了一个用于农村电气化离网微电网建模的开源强......
  • Python 转换为元组类型
    给对象添加一个__iter__函数:classCover:def__init__(self,temp,accel_x,accel_y,accel_z,cover_status):self.temp=tempself.accel_x=accel_xself.accel_y=accel_yself.accel_z=accel_zself.cover_status=......
  • 使用python下载某易云歌曲
    1、某易云的外链地址:url='http://music.163.com/song/media/outer/url?id='+歌曲的id值+'.mp3' 如:http://music.163.com/song/media/outer/url?id=1974443814.mp32、通过歌曲id下载:importrequestsimportosimportbs4fromseleniumimportwebdriverfro......
  • python请求有关ja3指纹问题
    遇见一个网站采集,无论怎样都返回空数据(实际上是有数据的),但是抓包下来又确实是那样的,请教了一些人推测是指纹验证,拜读了网上其他大佬的博客文章后实验了一下,发现确实是这个问题!第一次知道tcp还有这个东西,让我大受震撼,值此搬运一下。参考链接及来源:Python爬虫进阶必备|JA3指......
  • python.制图.饼状图
    1defsendMsgtemplate_card(fail,passnum,casename,casetime,path):importpandasaspdimportmatplotlib.pyplotasplt#将测试结果转换为数值类型data1={'errors':'0','failures':fail,'skipped':'1'......