17370845950

PythonYAML配置文件怎么读写_pyyaml实战说明【指导】
Python读写YAML配置文件应使用PyYAML库的safe_load和safe_dump方法确保安全,处理编码、异常、格式化及结构校验等关键细节。

Python 读写 YAML 配置文件,核心靠 PyYAML,它把 YAML 文本和 Python 数据结构(字典、列表、字符串、布尔值、None)双向转换。关键不是“能不能读”,而是“怎么安全、准确、可维护地读写”。

安装与基础读取:用 safe_load 解析配置

别用 yaml.load() —— 它可能执行任意代码,有严重安全隐患。始终用 yaml.safe_load()

示例(读取 config.yaml):

import yaml

with 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(),避免序列化不可序列化的对象(如自定义类实例、函数),也更易读。

常用参数提升可维护性:

  • 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 支持日期(2025-05-20)、null(对应 Python None)、锚点与引用(&id / *id)。PyYAML 默认支持前两者,锚点需启用 yaml.FullLoader(仅当真需要复用结构时才用,否则增加复杂度)。

  • 时间字符串会自动转为 datetime.datedatetime.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 做强类型校验(进阶推荐)