apppublic/aidocs/pickleUtils.md
2025-10-05 11:23:33 +08:00

3.3 KiB
Raw Permalink Blame History

数据序列化与反序列化工具函数文档

本模块提供了两个用于保存和加载 Python 对象的便捷函数,利用 pickle 模块实现对象的持久化存储。


1. 函数:saveData(fn, *args)

功能

将任意数量的 Python 对象序列化并保存到指定文件中。

参数

参数 类型 说明
fn str 要保存数据的文件路径(字符串形式)
*args 任意数量的参数 要保存的一个或多个 Python 对象

实现细节

  • 文件以二进制写模式 ('wb') 打开。
  • 使用列表推导式依次调用 pickle.dump() 将每个传入的对象写入文件。
  • 写入完成后自动关闭文件。

⚠️ 注意:pickle.dump() 的返回值是 None,因此列表推导式中的变量 a 实际上是一个由 None 组成的列表,仅用于触发副作用(即执行 dump 操作),并无实际用途。

示例

data1 = {'name': 'Alice', 'age': 30}
data2 = [1, 2, 3, 4]
saveData('my_data.pkl', data1, data2)

该代码会将字典 data1 和列表 data2 序列化后保存到 my_data.pkl 文件中。


2. 函数:loadData(fn, cnt)

功能

从指定文件中反序列化出指定数量的 Python 对象。

参数

参数 类型 说明
fn str 包含已保存数据的文件路径
cnt int 预期要读取的对象数量

返回值

  • 成功时:返回一个包含 cnt 个反序列化对象的列表。
  • 失败时(如文件不存在、损坏或数据不足):返回一个包含 cntNone 的列表。

实现细节

  • 文件以二进制读模式 ('rb') 打开。
  • 使用列表推导式调用 pickle.load() 连续读取 cnt 个对象。
  • 正常情况下返回读取到的数据列表。
  • 若发生异常(如 EOFError, FileNotFoundError 等),捕获所有异常并返回初始化为 None 的列表。

⚠️ 注意:此函数使用宽泛的 except: 语句,可能掩盖错误。建议在生产环境中替换为更具体的异常处理。

示例

data1, data2 = loadData('my_data.pkl', 2)
print(data1)  # 输出: {'name': 'Alice', 'age': 30}
print(data2)  # 输出: [1, 2, 3, 4]

使用注意事项

  1. 安全性pickle 模块不安全用于加载不受信任的数据,因为它可以执行任意代码。请仅用于可信来源的数据。
  2. 文件格式:保存的文件为二进制格式,不可直接阅读或编辑。
  3. 版本兼容性:不同 Python 版本之间的 pickle 协议可能存在兼容性问题。
  4. 异常处理loadData 中的 try-except 块过于宽泛,建议根据需要捕获特定异常(如 EOFError, FileNotFoundError)以便调试。

完整示例

# 保存数据
user_info = {'username': 'Bob', 'level': 5}
scores = [88, 92, 76]
saveData('game_save.pkl', user_info, scores)

# 加载数据
loaded_user, loaded_scores = loadData('game_save.pkl', 2)
print(loaded_user)    # {'username': 'Bob', 'level': 5}
print(loaded_scores)  # [88, 92, 76]

适用场景:快速原型开发、本地配置/状态保存、小型项目中的简单持久化需求。
不推荐用于:跨平台数据交换、网络传输、高安全性要求环境。