一、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()

核心要点

  1. 带 s 对字符串,不带 s 对文件

  2. os负责“路”(路径),json负责“货”(数据)。

  3. 文件操作务必关注编码和异常处理(如文件不存在)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐