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
- 确保文件编码为 UTF-8,尤其含中文时
- YAML 中的注释会被忽略,不参与解析
- 如果文件为空或格式错误,
safe_load返回None或抛出yaml.YAMLError,建议加异常处理
安全写入:用 safe_dump 生成可读配置
写入时优先用 yaml.safe_dump(),避免序列化不可序列化的对象(如自定义类实例、函数),也更易读。
立即学习“Python免费学习笔记(深入)”;
常用参数提升可维护性:
-
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)
处理多文档与特殊类型:时间、Null、锚点不是必须但得知道
YAML 支持日期(2024-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)替代直接索引,防 KeyError - 简单校验可用
assert isinstance(config.get("port"), int) - 合并配置推荐用
deepcopy+ 递归更新,或借助pydantic做强类型校验(进阶推荐)










