--- title: Dict Json Pickle fid: 20250318-103250 keywords: dict, json, pickle --- (20250318-103250)= (Dict-Json-Pickle)= # Dict Json vs Pickle 2025-03-18 **难度**: 2 **时长**: 30 min 在 Python 里,你能够借助 `json` 和 `pickle` 模块把 `dict` 数据保存到文件里,之后再读取出来。下面为你呈现详细的入门教程。 ### 1. 使用 `json` 模块保存和读取 `dict` 数据 `json` 模块可用于处理 JSON 数据,JSON 是一种轻量级的数据交换格式,易于阅读和编写。以下是使用 `json` 模块保存和读取 `dict` 数据的示例代码: ```python import json # 定义一个字典 data = { "name": "John", "age": 30, "city": "New York" } # 将字典保存为 JSON 文件 file_path = 'data.json' try: with open(file_path, 'w') as file: json.dump(data, file) print(f"数据已成功保存到 {file_path}") except Exception as e: print(f"保存数据时出错: {e}") # 从 JSON 文件中读取数据 try: with open(file_path, 'r') as file: loaded_data = json.load(file) print("从文件中读取的数据:") print(loaded_data) except FileNotFoundError: print("错误: 文件未找到!") except Exception as e: print(f"读取数据时出错: {e}") ``` ### 代码解释 - 首先,我们定义了一个包含个人信息的字典 `data`。 - 接着,使用 `json.dump()` 函数将字典保存到 `data.json` 文件中。 - 最后,使用 `json.load()` 函数从 `data.json` 文件中读取数据并打印。 ### 2. 使用 `pickle` 模块保存和读取 `dict` 数据 `pickle` 模块可以将 Python 对象序列化为二进制格式,并且可以将其反序列化为原始对象。以下是使用 `pickle` 模块保存和读取 `dict` 数据的示例代码: ```python import pickle # 定义一个字典 data = { "name": "John", "age": 30, "city": "New York" } # 将字典保存为 pickle 文件 file_path = 'data.pickle' try: with open(file_path, 'wb') as file: pickle.dump(data, file) print(f"数据已成功保存到 {file_path}") except Exception as e: print(f"保存数据时出错: {e}") # 从 pickle 文件中读取数据 try: with open(file_path, 'rb') as file: loaded_data = pickle.load(file) print("从文件中读取的数据:") print(loaded_data) except FileNotFoundError: print("错误: 文件未找到!") except Exception as e: print(f"读取数据时出错: {e}") ``` ### 代码解释 - 同样,我们定义了一个包含个人信息的字典 `data`。 - 然后,使用 `pickle.dump()` 函数将字典保存到 `data.pickle` 文件中。注意,`pickle` 文件是以二进制模式打开的。 - 最后,使用 `pickle.load()` 函数从 `data.pickle` 文件中读取数据并打印。 ### 3. `json` 和 `pickle` 的对比 - **数据格式**: - `json` 是一种文本格式,易于人类阅读和编写,也易于在不同编程语言之间交换数据。 - `pickle` 是一种二进制格式,只能在 Python 中使用。 - **数据类型支持**: - `json` 只支持基本的数据类型,如 `dict`、`list`、`str`、`int`、`float`、`bool` 和 `None`。 - `pickle` 可以处理任意的 Python 对象,包括自定义类的实例。 - **安全性**: - `json` 是安全的,因为它只包含文本数据。 - `pickle` 在反序列化时可能存在安全风险,因为它可以执行任意的 Python 代码。因此,不要从不可信的来源加载 `pickle` 文件。 综上所述,如果你需要在不同编程语言之间交换数据,或者需要数据具有可读性,那么使用 `json` 是一个不错的选择。如果你只在 Python 中使用,并且需要处理复杂的 Python 对象,那么可以考虑使用 `pickle`。但要注意 `pickle` 的安全性问题。