Python 核心工具箱:一文搞懂 os 与 json 模块的文件操作与序列化
·
一、os 模块:与操作系统对话的桥梁
os模块提供了与操作系统交互的功能,比如文件路径处理、目录创建、环境变量读取等。
1.1 最常用的路径操作
在Python 3.4+,推荐使用os.path子模块或更现代的pathlib,但os.path依然是最广泛的兼容写法。
import os
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前目录: {current_dir}")
# 拼接路径(自动适配 Windows / Linux 分隔符)
file_path = os.path.join("data", "config", "settings.json")
print(f"拼接后的路径: {file_path}")
# 获取文件所在目录名和文件名
dir_name = os.path.dirname(file_path) # data/config
base_name = os.path.basename(file_path) # settings.json
print(f"目录: {dir_name}, 文件名: {base_name}")
# 检查路径是否存在
if os.path.exists(file_path):
print("文件存在!")
else:
print("文件不存在,可能需要创建。")
# 创建多级目录(exist_ok=True 避免目录已存在时报错)
os.makedirs(os.path.dirname(file_path), exist_ok=True)
1.2 为什么需要配合 json?
os帮我们定位和创建文件路径,而json则负责将Python对象转换为可存储的字符串,或从文件中恢复数据。两者天然互补。
二、json 模块:数据的“打包”与“拆包”
json模块用于处理JSON(JavaScript Object Notation)数据格式。JSON是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。
在Python中,JSON与Python数据类型的映射关系如下:
| JSON 类型 | Python 类型 |
|---|---|
| 对象 (object) | dict |
| 数组 (array) | list |
| 字符串 (string) | str |
| 数字 (number) | int / float |
| true/false | True/False |
| null | None |
2.1 四大核心方法总览
| 方法 | 作用 | 输入 | 输出 |
|---|---|---|---|
json.dumps() |
序列化:Python对象 → JSON 字符串 | Python对象 | str |
json.dump() |
序列化:Python对象 → JSON 文件 | Python对象 + 文件对象 | 写入文件,无返回值 |
json.loads() |
反序列化:JSON 字符串 → Python对象 | str |
Python对象 |
json.load() |
反序列化:JSON 文件 → Python对象 | 文件对象 | Python对象 |
记忆口诀:
带
s的(dumps/loads)处理的是 字符串(string)。不带
s的(dump/load)处理的是 文件(file)。
dump是“倒出/转储”(写出去),load是“加载”(读进来)。
三、逐个击破:四个方法的详细用法与案例
3.1 json.dumps() —— 将对象转为JSON字符串
import json
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"scores": [95, 87, 92],
"address": None
}
json_str = json.dumps(data)
print(type(json_str)) # <class 'str'>
print(json_str)
# 输出: {"name": "Alice", "age": 30, "is_student": false, "scores": [95, 87, 92], "address": null}
美化输出(格式化):
pretty_str = json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False)
print(pretty_str)
-
indent=4:缩进4个空格,提高可读性。 -
sort_keys=True:按键排序。 -
ensure_ascii=False:允许输出中文等非ASCII字符(否则会显示为\uXXXX)。
3.2 json.dump() —— 将对象直接写入文件
import json
import os
data = {"project": "AI", "version": 2.0, "tags": ["cv", "nlp"]}
# 确保目录存在
os.makedirs("output", exist_ok=True)
with open("output/config.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
print("数据已写入 output/config.json")
注意:文件要以写入模式
'w'打开,且指定encoding='utf-8'以避免中文乱码。
3.3 json.loads() —— 从JSON字符串解析为Python对象
import json
json_string = '{"name": "Bob", "age": 25, "active": true}'
parsed = json.loads(json_string)
print(parsed) # {'name': 'Bob', 'age': 25, 'active': True}
print(type(parsed)) # <class 'dict'>
print(parsed["name"]) # Bob
常见场景:接收API响应(requests.get().text)后,用loads解析成字典操作。
3.4 json.load() —— 从文件中读取JSON并解析
import json
with open("output/config.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
print(loaded_data)
# {'project': 'AI', 'version': 2.0, 'tags': ['cv', 'nlp']}
print(loaded_data["tags"]) # ['cv', 'nlp']
四、实战组合:os + json 完成配置管理
我们常常需要将配置信息保存在JSON文件中,并在程序启动时加载。下面是一个完整的实战示例。
4.1 场景:用户配置的持久化
import json
import os
CONFIG_DIR = "configs"
CONFIG_FILE = os.path.join(CONFIG_DIR, "user_settings.json")
DEFAULT_CONFIG = {
"theme": "dark",
"language": "zh-CN",
"notifications": True,
"volume": 80
}
def ensure_config_dir():
"""确保配置目录存在"""
os.makedirs(CONFIG_DIR, exist_ok=True)
def save_config(config_data):
"""保存配置到JSON文件"""
ensure_config_dir()
with open(CONFIG_FILE, "w", encoding="utf-8") as f:
json.dump(config_data, f, indent=4, ensure_ascii=False)
def load_config():
"""加载配置文件,若不存在则创建默认配置"""
if not os.path.exists(CONFIG_FILE):
print("配置文件不存在,使用默认配置并保存")
save_config(DEFAULT_CONFIG)
return DEFAULT_CONFIG.copy()
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
return json.load(f)
# 使用示例
if __name__ == "__main__":
config = load_config()
print("当前配置:")
print(json.dumps(config, indent=2)) # 用dumps打印好看的格式
# 修改配置
config["theme"] = "light"
config["volume"] = 100
save_config(config)
print("配置已更新!")
五、常见陷阱与最佳实践
5.1 常见陷阱
| 陷阱 | 解决方案 |
|---|---|
忘记指定 encoding='utf-8' |
打开文件时始终指定,避免中文乱码 |
混淆 dump 与 dumps |
记住:s=字符串,无s=文件 |
| JSON中键必须是字符串 | Python字典的键如果是数字,dumps会自动转为字符串;但loads后键仍是字符串 |
| 处理自定义对象(如datetime) | 需自定义default参数或继承JSONEncoder |
| 文件路径分隔符问题 | 使用os.path.join(),不要手写 \ 或 / |
六、总结
| 场景 | 推荐方法 |
|---|---|
| 调试时打印JSON数据 | json.dumps(data, indent=2) |
| 将数据保存到文件 | json.dump(data, file) |
| 接收API返回的JSON字符串 | json.loads(response_text) |
| 读取本地的JSON配置文件 | json.load(file) |
| 构建安全的文件路径 | os.path.join() |
| 检查/创建目录 | os.path.exists() + os.makedirs() |
核心要点:
-
带
s对字符串,不带s对文件。 -
os负责“路”(路径),json负责“货”(数据)。 -
文件操作务必关注编码和异常处理(如文件不存在)。
更多推荐


所有评论(0)