Python3 pickle模块的实现步骤

 更新时间:2026年03月16日 08:46:00   作者:Frunze软件开发  
Python的pickle模块提供强大的对象序列化功能,本文就来详细的介绍一下Python3 pickle模块的实现步骤,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

pickle 是 Python 的一个强大序列化模块,它可以将几乎任何 Python 对象转换为字节流(序列化),也可以从字节流重新构造对象(反序列化)

1. 基本用法

1.1 序列化对象(pickling)

import pickle

data = {
    'name': 'Alice',
    'age': 30,
    'scores': [85, 92, 88],
    'is_active': True
}

# 序列化到字节对象
serialized = pickle.dumps(data)
print(serialized)  # 输出字节序列

# 序列化到文件
with open('data.pkl', 'wb') as f:  # 注意是二进制写入模式
    pickle.dump(data, f)

1.2 反序列化对象(unpickling)

import pickle

# 首先创建一个示例数据对象
data = {
    'name': 'Alice',
    'age': 30,
    'scores': [85, 92, 88],
    'is_active': True
}

# 1. 序列化对象到字节(创建serialized变量)
serialized = pickle.dumps(data)
print("序列化后的字节数据:", serialized)

# 2. 从字节对象反序列化
deserialized = pickle.loads(serialized)
print("反序列化后的数据:", deserialized)  # 输出原始数据

# 3. 序列化到文件
with open('data.pkl', 'wb') as f:  # 注意是二进制写入模式
    pickle.dump(data, f)

# 4. 从文件反序列化
with open('data.pkl', 'rb') as f:  # 注意是二进制读取模式
    loaded_data = pickle.load(f)
    print("从文件加载的数据:", loaded_data)

2. 可序列化的对象类型

pickle 可以序列化大多数 Python 对象,包括:

  • 基本数据类型(int, float, bool, str 等)
  • 容器类型(list, tuple, dict, set)
  • 函数和类(只序列化名称,不序列化代码)
  • 类的实例(包括自定义类)
  • 模块级函数和类

3. 高级特性

3.1 自定义类的序列化

import pickle

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __repr__(self):
        return f"Person(name='{self.name}', age={self.age})"

alice = Person('Alice', 30)

# 序列化自定义类实例
with open('person.pkl', 'wb') as f:
    pickle.dump(alice, f)

# 反序列化
with open('person.pkl', 'rb') as f:
    loaded_person = pickle.load(f)
    print(loaded_person)  # Person(name='Alice', age=30)

3.2 序列化协议版本

pickle 有多个协议版本,可以通过 protocol 参数指定:

# 使用最高效的协议版本(Python 3.8+默认使用协议4)
pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)

# 可用的协议版本:
# 0 - 原始ASCII协议(兼容旧版本)
# 1 - 旧二进制格式
# 2 - Python 2.3引入
# 3 - Python 3.0引入(默认Python 3.0-3.7)
# 4 - Python 3.4引入(默认Python 3.8+)
# 5 - Python 3.8引入(支持带外数据)

4. 安全注意事项

⚠️ 重要警告:pickle 反序列化可以执行任意代码,永远不要反序列化不受信任来源的数据

# 不安全的做法(可能执行恶意代码)
malicious_data = b"cos\nsystem\n(S'rm -rf /'\ntR."  # 模拟恶意pickle数据
# pickle.loads(malicious_data)  # 危险!会执行系统命令

安全替代方案:

  • 对于不受信任的数据,使用 json 模块
  • 或者使用 ast.literal_eval() 处理简单数据结构

5. 特殊方法控制序列化

自定义类可以通过实现特殊方法来控制序列化行为:

import pickle

class CustomObject:
    def __init__(self, value):
        self.value = value
        self._internal = "secret"
    
    # 定义序列化时要保存的属性
    def __getstate__(self):
        state = self.__dict__.copy()
        del state['_internal']  # 不序列化内部属性
        return state
    
    # 定义反序列化时的行为
    def __setstate__(self, state):
        self.__dict__.update(state)
        self._internal = "restored"  # 恢复时重新设置

obj = CustomObject(42)
serialized = pickle.dumps(obj)
new_obj = pickle.loads(serialized)
print(new_obj.value)  # 42
print(new_obj._internal)  # "restored"

6. 性能优化

对于大型对象的序列化:

# 使用更高效的协议
data = [i**2 for i in range(100000)]

# 比较不同协议的大小
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
    size = len(pickle.dumps(data, protocol=proto))
    print(f"协议 {proto}: {size} 字节")

# 使用更快的pickle实现(需要安装)
# pip install pickle5  # 对于Python < 3.8想使用协议5

7. 实际应用场景

7.1 缓存计算结果

import pickle
import hashlib
import os

def compute_expensive_operation(params):
    cache_file = f"cache_{hashlib.md5(str(params).encode()).hexdigest()}.pkl"
    
    if os.path.exists(cache_file):
        with open(cache_file, 'rb') as f:
            return pickle.load(f)
    
    # 模拟耗时计算
    result = sum(x**2 for x in range(params['n']))
    
    # 缓存结果
    with open(cache_file, 'wb') as f:
        pickle.dump(result, f)
    
    return result

7.2 进程间通信

import pickle
from multiprocessing import Pool

# 在多进程中使用pickle传递数据

def process_data(data):
    # 处理数据...
    return data * 2

if __name__ == '__main__':
    data = [1, 2, 3, 4, 5]
    with Pool() as pool:
        results = pool.map(process_data, data)
    print(results)  # [2, 4, 6, 8, 10]

8. 替代方案比较

特性picklejsonmarshalshelve
人类可读
跨语言支持
序列化复杂对象⚠️
安全性
内置支持

总结

pickle 是 Python 中最强大的序列化工具,适合:

  • 需要保存 Python 特有对象(如自定义类实例)
  • 临时存储 Python 数据
  • 进程间传递复杂对象

但需要注意:

  • 永远不要反序列化不受信任的数据
  • pickle 文件不能跨 Python 版本/实现(如 CPython 和 PyIron)兼容
  • 对于长期存储或跨语言场景,考虑使用 JSON 或其他格式

到此这篇关于Python3 pickle模块的实现步骤的文章就介绍到这了,更多相关Python3 pickle模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python @property及getter setter原理详解

    Python @property及getter setter原理详解

    这篇文章主要介绍了Python @property及getter setter原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • python发送邮件示例(支持中文邮件标题)

    python发送邮件示例(支持中文邮件标题)

    python发送中文邮件示例,支持中文邮件标题和中文邮件内容。支持多附件。根据用户名推测邮件服务器提供商
    2014-02-02
  • python实现报表自动化详解

    python实现报表自动化详解

    这篇文章主要介绍了python实现报表自动化详解,涉及python读,写excel—xlwt常用功能,xlutils 常用功能,xlwt写Excel时公式的应用等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • PyCharm进行Django项目开发环境搭建

    PyCharm进行Django项目开发环境搭建

    本文主要介绍了PyCharm进行Django项目开发环境搭建,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • python机器学习使数据更鲜活的可视化工具Pandas_Alive

    python机器学习使数据更鲜活的可视化工具Pandas_Alive

    今天我分享大家一款非常棒的动画可视化工具:Pandas_Alive,它以 matplotlib 绘图为后端,不仅可以创建出令人惊叹的动画可视化,而且使用方法非常简单。本文详情如下
    2021-11-11
  • Python读取二进制文件代码方法解析

    Python读取二进制文件代码方法解析

    这篇文章主要介绍了Python读取二进制文件代码方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python入门_学会创建并调用函数的方法

    Python入门_学会创建并调用函数的方法

    下面小编就为大家带来一篇Python入门_学会创建并调用函数的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Django项目如何配置Memcached和Redis缓存?选择哪个更有优势?

    Django项目如何配置Memcached和Redis缓存?选择哪个更有优势?

    这篇文章主要介绍了Django项目如何配置Memcached和Redis缓存,帮助大家更好的理解和学习使用django框架,感兴趣的朋友可以了解下
    2021-04-04
  • 通过Python的gtts库将文字转为音频的操作方法

    通过Python的gtts库将文字转为音频的操作方法

    文字转音频可以帮助视觉障碍者通过听取声音来获取信息,也可以帮助人们方便地听取一些长篇文章或学习资料,节省阅读时间和疲劳,这篇文章主要介绍了通过Python的gtts库将文字转为音频的方法,需要的朋友可以参考下
    2023-05-05
  • Python+Matplotlib绘制小提琴图的示例代码

    Python+Matplotlib绘制小提琴图的示例代码

    小提琴图 (Violin Plot) 类似纺锤,是一种用来显示数据分布和概率密度的图形,本文为大家介绍了Matplotlib绘制小提琴图的函数源码,需要的可以参考一下
    2023-06-06

最新评论