93 lines
3.3 KiB
Markdown
93 lines
3.3 KiB
Markdown
# 数据序列化与反序列化工具函数文档
|
||
|
||
本模块提供了两个用于保存和加载 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]
|
||
```
|
||
|
||
---
|
||
|
||
✅ **适用场景**:快速原型开发、本地配置/状态保存、小型项目中的简单持久化需求。
|
||
❌ **不推荐用于**:跨平台数据交换、网络传输、高安全性要求环境。 |