3.3 KiB
3.3 KiB
数据序列化与反序列化工具函数文档
本模块提供了两个用于保存和加载 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个反序列化对象的列表。 - 失败时(如文件不存在、损坏或数据不足):返回一个包含
cnt个None的列表。
实现细节
- 文件以二进制读模式 (
'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]
使用注意事项
- 安全性:
pickle模块不安全用于加载不受信任的数据,因为它可以执行任意代码。请仅用于可信来源的数据。 - 文件格式:保存的文件为二进制格式,不可直接阅读或编辑。
- 版本兼容性:不同 Python 版本之间的
pickle协议可能存在兼容性问题。 - 异常处理:
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]
✅ 适用场景:快速原型开发、本地配置/状态保存、小型项目中的简单持久化需求。
❌ 不推荐用于:跨平台数据交换、网络传输、高安全性要求环境。