讲师中心 微信公众号
AI工具推荐 视频效率加速

Python中的pickle模块是什么 pickle模块与json模块有什么区别

小婷大大_5577

小婷大大_5577

发布时间:2025-06-26 08:13:01

|

1070人浏览过

|

来源于php中文网

原创

python的pickle模块主要用于序列化和反序列化python对象。1.pickle与json的主要区别在于数据类型支持、可读性和安全性:pickle能处理几乎所有python对象,包括自定义类实例,而json仅支持基本数据类型;json是文本格式可读性强,pickle为二进制不可读;pickle存在执行恶意代码的风险,json更安全。2.选择使用场景:若需在python内部保存对象状态,用pickle;若需跨语言交换数据或要求可读性,选json。3.提高pickle安全性的方法包括:仅加载可信来源数据;使用cloudpickle替代;通过签名验证数据完整性。总之,pickle功能强大但需谨慎使用以避免安全隐患。

Python中的pickle模块是什么 pickle模块与json模块有什么区别

Python的pickle模块主要用于序列化和反序列化Python对象,简单来说,就是把Python对象(比如列表、字典、类实例)转换成字节流,方便存储到文件或者通过网络传输,之后再把这些字节流还原成原来的Python对象。它和json模块有点像,但也有不少区别。

Python中的pickle模块是什么 pickle模块与json模块有什么区别

pickle模块能让你保存和加载Python对象的状态,而json主要用于数据交换,尤其是在不同编程语言之间。

Python中的pickle模块是什么 pickle模块与json模块有什么区别

pickle模块与json模块的区别

立即学习“Python免费学习笔记(深入)”;

Python中的pickle模块是什么 pickle模块与json模块有什么区别

为什么需要pickle模块?

想象一下,你有一个复杂的Python数据结构,比如一个包含多个自定义类实例的字典。如果每次程序运行都要重新创建这些对象,那效率就太低了。使用pickle,你可以把这个字典保存到硬盘上,下次程序启动时直接加载,省时省力。而且,pickle还能处理循环引用等复杂情况,这是json做不到的。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

pickle和json在数据类型支持上的差异

json只能序列化基本的数据类型,比如字符串、数字、布尔值、列表和字典。而pickle可以序列化几乎所有的Python对象,包括自定义类的实例、函数等等。这意味着pickle更强大,但也带来了一些安全风险,后面会提到。

pickle和json在可读性上的差异

json格式是文本形式,人类可读性非常好。你可以直接打开json文件查看里面的内容。pickle是二进制格式,人类很难直接阅读。这使得json更适合用于配置文件或者需要在不同系统之间交换数据的情况。

pickle和json在安全方面的考量

这是pickle最大的问题。由于pickle可以序列化任意Python对象,包括恶意代码,所以在反序列化pickle数据时存在安全风险。如果你加载了一个来自不可信来源的pickle文件,可能会执行其中的恶意代码。因此,永远不要反序列化来自不可信来源的pickle数据。json在这方面更安全,因为它只能序列化基本数据类型,不能执行代码。

使用场景选择:pickle vs json

选择哪个模块取决于你的具体需求。

  • 如果你需要保存Python对象的状态,并且只在Python环境中使用,那么pickle是更好的选择。 比如,保存机器学习模型的训练结果,或者保存游戏的状态。
  • 如果你需要在不同的编程语言之间交换数据,或者需要人类可读的格式,那么json是更好的选择。 比如,Web API的数据交换,或者配置文件。

Pickle的简单使用示例

import pickle

# 创建一个字典
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}

# 将字典序列化到文件
with open('data.pickle', 'wb') as f:
    pickle.dump(data, f)

# 从文件反序列化字典
with open('data.pickle', 'rb') as f:
    loaded_data = pickle.load(f)

print(loaded_data)  # 输出: {'name': 'Alice', 'age': 30, 'city': 'New York'}

如何提高pickle的安全性?

虽然pickle存在安全风险,但如果你必须使用它,可以采取一些措施来提高安全性:

  • 只加载来自可信来源的pickle数据。
  • 使用更安全的序列化方法,比如cloudpickle。 cloudpickle是pickle的一个替代品,它在序列化和反序列化时会进行更多的安全检查。
  • 对pickle数据进行签名验证。 在序列化数据时,计算一个签名,然后将签名和数据一起保存。在反序列化时,重新计算签名,并与保存的签名进行比较。如果签名不匹配,说明数据可能被篡改过。
import pickle
import hashlib

def serialize_with_signature(obj, file_path, secret_key):
    """序列化对象并添加签名."""
    serialized_data = pickle.dumps(obj)
    signature = hashlib.sha256(serialized_data + secret_key.encode()).hexdigest()
    with open(file_path, 'wb') as f:
        pickle.dump((serialized_data, signature), f)

def deserialize_with_signature(file_path, secret_key):
    """反序列化对象并验证签名."""
    with open(file_path, 'rb') as f:
        serialized_data, signature = pickle.load(f)

    expected_signature = hashlib.sha256(serialized_data + secret_key.encode()).hexdigest()
    if signature != expected_signature:
        raise ValueError("数据可能已被篡改!")

    return pickle.loads(serialized_data)

# 示例
data = {'name': 'Bob', 'age': 25}
secret = "my_secret_key"
file_path = "signed_data.pickle"

serialize_with_signature(data, file_path, secret)

try:
    loaded_data = deserialize_with_signature(file_path, secret)
    print("加载的数据:", loaded_data)
except ValueError as e:
    print("错误:", e)

总而言之,pickle是一个强大的工具,但务必小心使用。在安全性要求较高的场景下,json或者其他的序列化方法可能更适合。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2215

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3542

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1176

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4079

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3231

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

554

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

542

2026.02.12

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1838

2023.08.03

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Pandas 官方文档与用户指南
Pandas 官方文档与用户指南

共0课时 | 0人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 2万人学习

Redis中文开发手册
Redis中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn