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

93 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据序列化与反序列化工具函数文档
本模块提供了两个用于保存和加载 Python 对象的便捷函数,利用 `pickle` 模块实现对象的持久化存储。
---
## 1. 函数:`saveData(fn, *args)`
### 功能
将任意数量的 Python 对象序列化并保存到指定文件中。
### 参数
| 参数 | 类型 | 说明 |
|------|------|------|
| `fn` | `str` | 要保存数据的文件路径(字符串形式) |
| `*args` | `任意数量的参数` | 要保存的一个或多个 Python 对象 |
### 实现细节
- 文件以二进制写模式 (`'wb'`) 打开。
- 使用列表推导式依次调用 `pickle.dump()` 将每个传入的对象写入文件。
- 写入完成后自动关闭文件。
> ⚠️ 注意:`pickle.dump()` 的返回值是 `None`,因此列表推导式中的变量 `a` 实际上是一个由 `None` 组成的列表,仅用于触发副作用(即执行 dump 操作),并无实际用途。
### 示例
```python
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:` 语句,可能掩盖错误。建议在生产环境中替换为更具体的异常处理。
### 示例
```python
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`)以便调试。
---
## 完整示例
```python
# 保存数据
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]
```
---
**适用场景**:快速原型开发、本地配置/状态保存、小型项目中的简单持久化需求。
**不推荐用于**:跨平台数据交换、网络传输、高安全性要求环境。