Python管理配置最常用YAML、JSON和INI:YAML适合分层与多环境,需用safe_load;JSON轻量标准,支持自定义解码;INI适合简单分节,需手动类型转换;推荐封装ConfigLoader统一加载、环境覆盖与校验。

Python 中管理配置最常用的方式是读取 YAML、JSON 和 INI 文件,它们结构清晰、易读易写,适合不同复杂度的项目。关键不在于“能读出来”,而在于如何统一加载、安全解析、支持环境切换、并方便地注入到应用逻辑中。
YAML:适合分层配置和多环境管理
YAML 支持注释、锚点、引用、多文档,特别适合微服务或需要 dev/staging/prod 多套配置的场景。用 PyYAML 时务必禁用 yaml.load()(有反序列化风险),改用 yaml.safe_load()。
- 安装:
pip install pyyaml - 基础读取:
import yaml with open("config.yaml", "r", encoding="utf-8") as f: cfg = yaml.safe_load(f) - 推荐结构示例(
config.yaml):database: host: ${DB_HOST:localhost} port: ${DB_PORT:5432} name: myapp注意:原生 YAML 不支持环境变量插值,需配合 envyaml 或手动用logging: level: INFO file: logs/app.log
os.environ.get()替换
JSON:轻量、标准、无注释但解析最快
JSON 是 Web 场景中最通用的配置格式,结构严格、无歧义、所有语言都原生支持。Python 的 json 模块开箱即用,无需额外依赖。
- 读取时注意编码(尤其含中文):
open(..., encoding="utf-8") - 可直接转为 Python 对象,也支持自定义解码器(如把字符串自动转为
datetime):import json from datetime import datetime
def datetime_decoder(d): for k, v in d.items(): if isinstance(v, str) and "T" in v and ":" in v: try: d[k] = datetime.fromisoformat(v.replace("Z", "+00:00")) except ValueError: pass return d
with open("config.json") as f: cfg = json.load(f, object_hook=datetime_decoder)
INI:适合简单键值对与分节配置
INI 格式天然支持“节”(section),比如 [database]、[cache],适合传统桌面工具或小型脚本。Python 内置 configparser 模块即可处理,但默认不支持嵌套或类型推断。
立即学习“Python免费学习笔记(深入)”;
- 启用插值(类似环境变量)需初始化时传
interpolation=ExtendedInterpolation() - 读取后所有值都是字符串,需手动转换类型:
from configparser import ConfigParser, ExtendedInterpolation
cfg = ConfigParser(interpolation=ExtendedInterpolation()) cfg.read("config.ini")
db_host = cfg.get("database", "host") db_port = cfg.getint("database", "port") # 自动转 int debug_mode = cfg.getboolean("app", "debug")
- 注意:INI 不支持列表或嵌套字典,若需表达数组,可用逗号分隔后
.split(",")处理
统一配置管理建议
避免在代码里散落多个 yaml.load 或 configparser.read 调用。推荐封装一个 ConfigLoader 类,支持:
- 按优先级合并多个文件(如
base.yaml+prod.yaml) - 自动加载环境变量覆盖(例如
CONFIG_DEBUG=true覆盖 YAML 中的 debug 字段) - 提供属性式访问(
cfg.database.host)或字典式访问(cfg["database"]["host"]) - 启动时校验必需字段,缺失则抛出明确错误,而非运行时报
KeyError
不复杂但容易忽略。










