Python读写YAML配置文件应使用PyYAML库的safe_load和safe_dump方法确保安全,处理编码、异常、格式化及结构校验等关键细节。
Python 读写 YAML 配置文件,核心靠 PyYAML 库
,它把 YAML 文本和 Python 数据结构(字典、列表、字符串、布尔值、None)双向转换。关键不是“能不能读”,而是“怎么安全、准确、可维护地读写”。
safe_load 解析配置别用 yaml.load() —— 它可能执行任意代码,有严重安全隐患。始终用 yaml.safe_load()。
示例(读取 config.yaml):
import yamlwith open("config.yaml", "r", encoding="utf-8") as f: config = yaml.safe_load(f)
print(config["database"]["host"]) # 如:localhost print(config["features"]["enable_logging"]) # 如:True
safe_load 返回 None 或抛出 yaml.YAMLError,建议加异常处理safe_dump 生成可读配置写入时优先用 yaml.safe_dump(),避免序列化不可序列化的对象(如自定义类实例、函数),也更易读。
常用参数提升可维护性:
default_flow_style=False:强制使用块格式(而非紧凑 JSON 风格)allow_unicode=True:保留中文等 Unicode 字符,不转义indent=2:设置缩进为 2 空格(默认也是 2,显式写明更清晰)config = {
"database": {
"host": "127.0.0.1",
"port": 5432,
"ssl": True
},
"features": {
"enable_cache": True,
"log_level": "INFO"
}
}
with open("config.yaml", "w", encoding="utf-8") as f:
yaml.safe_dump(config, f, default_flow_style=False, allow_unicode=True, indent=2)
YAML 支持日期(2025-05-20)、null(对应 Python None)、锚点与引用(&id / *id)。PyYAML 默认支持前两者,锚点需启用 yaml.FullLoader(仅当真需要复用结构时才用,否则增加复杂度)。
datetime.date 或 datetime.datetime 对象null、~、Null 都解析为 None
!!python/object 等标签,说明用了非安全加载器,应立即改用 safe_load
真实项目中,光读写不够,常需验证字段是否存在、类型是否正确,或合并多个 YAML(如 base.yaml + dev.yaml)。
dict.get(key, default) 替代直接索引,防 KeyErrorassert isinstance(config.get("port"), int)
deepcopy + 递归更新,或借助 pydantic 做强类型校验(进阶推荐)