目录

基本规则:

安装PyYAML依赖:

PyYAML核心方法:

核心语法:

1.基础数据类型

复杂数据结构(列表/字典):

高级特性(复用/锚点):

python 读取 yaml 文件的常用方法

常用:

保留注释:

类封装,适合大型项目

多文件合并: 

补充,写入 yaml 文件

总结:常见避坑点


YAML 是 Python 项目中最常用的配置文件格式,所有参数集中定义在 YAML 里。YAML 以键值对为基础,通过缩进实现嵌套,支持列表、字典、锚点复用。Python 文件通过读取 YAML 文件解析出参数字典,再在代码中调用这些参数。

基本规则:

  • 大小写敏感:ModelPath 和 modelpath 是两个不同参数;
  • 缩进表示层级关系:仅支持空格(推荐 2 个空格),禁止 Tab(会报错);
  • 键值对核心:键: 值 格式,冒号后必须加空格;
  • 注释:# 后加注释内容,注释内容不会被解析;
  • 数据类型:支持字符串、数字、布尔值、列表、字典、空值等,无需显式声明类型。

安装PyYAML依赖:

pip install pyyaml  # 基础版
pip install pyyaml ruamel.yaml  # 进阶版(支持YAML 1.2、注释保留)

不同版本差异:PyYAML 是 Python 操作 YAML 的核心库,主要分为 5.x 系列(主流) 和 3.x 系列(老旧)。YAML 1.2 是 2009 年发布的最新标准(1.1 是 2005 年版本),PyYAML 5.x+ 兼容两个版本

版本特性PyYAML 3.x(Python2 时代)PyYAML 5.x+(Python3 主流)补充说明
Python 版本支持仅 Python2(部分兼容 3.5-)Python3.6+(推荐 3.8+)3.x 已停止维护,不要使用
安全机制无 safe_load 核心方法新增 safe_load()load() 有代码注入风险,必用 safe_load()
YAML 语法支持仅 YAML 1.1兼容 YAML 1.1/1.21.2 是最新标准,支持更多类型
数据类型解析布尔值支持 True/False仅识别小写 true/false5.x 中 True 会被解析为字符串!
性能无优化新增 C 扩展加速5.4+ 解析速度提升 2-3 倍
第三方依赖无可选依赖 libyaml安装 libyaml 后性能更高
PyYAML核心方法:
方法作用安全风险适用场景/关键参数
yaml.load()解析 YAML 为 Python 对象(支持自定义类型)高(代码注入)仅本地可信配置,禁止用于外部输入
yaml.safe_load()仅解析 YAML 基础类型(str/int/list/dict)无99% 的配置文件场景(必用),safe_load 无额外参数,仅依赖文件对象
yaml.dump()Python 对象 → YAML 字符串(支持自定义类型)中同 safe_dump,但有安全风险
yaml.safe_dump()Python 基础类型 → YAML 字符串无

default_flow_style:是否单行显示allow_unicode:是否支持中文

sort_keys:是否排序键

核心语法:

1.基础数据类型

创建 basic_types.yaml:

# 1. 字符串(引号可选,含特殊字符/空格时必加)
model_name: project1        # 无引号(无特殊字符推荐无引号)
model_path: "/data/models/7b"     # 单引号/双引号必加(含特殊字符/)

    # | 和 > 是 YAML 中多行字符串的两种表示方式,核心区别是对「换行符」的处理:

prompt: |                         # 多行字符串(保留换行符和末尾空行)
  You are a memory expert.
  Task: {task}
  Memories: {memories}
short_prompt: >             # 折叠换行,将连续换行替换为单个空格,仅保留显式空行;
  This is a long prompt     # This is a long prompt but will be folded into a single line.
  but will be folded into 
  a single line.

# 2. 数字(整数/浮点数)
train_epochs: 10                  # 整数
learning_rate: 1e-5               # 浮点数(科学计数法)
batch_size: 32.0                  # 浮点数(自动识别)

# 3. 布尔值(小写!true/false,不是True/False)
use_vllm: true
enable_log: false

# 4. 空值(null/~ 均可)
cache_path: null                  # 禁用缓存
temp_dir: ~                       # 等价于 null

# 5. 时间(自动解析为字符串,需手动转换为datetime)
train_start_time: 2026-03-15 09:00:00

python读取示例:

import yaml

# 读取YAML文件
with open("basic_types.yaml", "r", encoding="utf-8") as f:
    config = yaml.safe_load(f)

# 调用参数
print("模型名称:", config["model_name"])          # 输出:project1
print("多行Prompt:", config["prompt"])           # 保留换行的完整字符串
print("是否启用vLLM:", config["use_vllm"])       # 输出:True
print("空值:", config["cache_path"])             # 输出:None
复杂数据结构(列表/字典):

对应 Python 中 list 和 dict,创建 complex_structures.yaml:

# 1. 列表(数组):- 开头,支持单行/多行
# 方式1:多行列表(推荐,易读)
retrieval_top_k:
  - 10    
  - 5     
  - 3    

# 方式2:单行列表(简写)
gpu_ids: [0, 1, 2, 3]

# 2. 嵌套字典(层级配置)
project1:
  actor:  # 第一层嵌套
    model_path: "/data/actor"
    hyper_params:  # 第二层嵌套
      temperature: 0.1
      top_p: 0.9
  ref:
    model_path: "/data/ref"
    hyper_params:
      temperature: 0.0

# 3. 列表嵌套字典(多模型配置)
working_agents:
  - name: qwen-72b-chat
    max_context: 128000
    use_vllm: true
  - name: baichuan-13b
    max_context: 64000
    use_vllm: false

python 读取示例:

import yaml

with open("complex_structures.yaml", "r", encoding="utf-8") as f:
    config = yaml.safe_load(f)

# 调用列表
print("精检索数:", config["retrieval_top_k"][1])  # 输出:5
print("GPU ID列表:", config["gpu_ids"])            # 输出:[0,1,2,3]

# 调用嵌套字典
actor_temp = config["project1"]["actor"]["hyper_params"]["temperature"]
print("Actor模型温度:", actor_temp)  # 输出:0.1

# 遍历列表字典(多模型配置)
for agent in config["working_agents"]:
    print(f"模型名:{agent['name']},最大上下文:{agent['max_context']}")
# 输出:
# 模型名:qwen-72b-chat,最大上下文:128000
# 模型名:baichuan-13b,最大上下文:64000
高级特性(复用/锚点):

YAML 支持锚点和引用,使用&完成锚点定义,*完成锚点引用,减少重复配置

创建 advanced_features.yaml:

# 1. 基础锚点:复用单个值
&default_temp 0.1  # 定义锚点
actor_temp: *default_temp  # 引用锚点
ref_temp: *default_temp    # 复用

# 2. 字典锚点:复用整个字典(<<: *锚点 表示继承)
&common_model_config  # 定义通用配置锚点
  device: cuda
  batch_size: 8
  temperature: 0.1

actor:
  <<: *common_model_config  # 继承通用配置
  model_path: "/data/actor"
  temperature: 0.2  # 覆盖通用配置

ref:
  <<: *common_model_config  # 复用通用配置
  model_path: "/data/ref"

# 3. 合并锚点:多个锚点合并
&base_reward
  answer_weight: 0.7
&rank_reward
  rank_weight: 0.3

total_reward:
  <<: [*base_reward, *rank_reward]  # 合并两个锚点
  baseline: 0.2  # 新增参数
  • <<: *common_model_config 会将通用配置的所有键值对「复制」到 actor 字典中;
  • 如果 actor 中定义了同名键(如 temperature),则用新值覆盖复制来的原值;
  • 未定义的键(如 device)则保留通用配置的值。

python 读取示例:

import yaml

with open("advanced_features.yaml", "r", encoding="utf-8") as f:
    config = yaml.safe_load(f)

# 锚点引用结果
print("Actor模型设备:", config["actor"]["device"])  # 输出:cuda(继承通用配置)
print("Actor模型温度:", config["actor"]["temperature"])  # 输出:0.2(覆盖)
print("奖励配置:", config["total_reward"])
# 输出:{'answer_weight': 0.7, 'rank_weight': 0.3, 'baseline': 0.2}

python 读取 yaml 文件的常用方法

常用:
import yaml

def load_yaml_basic(path):
    with open(path, "r", encoding="utf-8") as f:
        return yaml.safe_load(f)

# 调用
config = load_yaml_basic("config.yaml")
保留注释:

PyYAML 会丢失注释,ruamel.yaml 是进阶选择(了解即可):

from ruamel.yaml import YAML

def load_yaml_with_comments(path):
    yaml = YAML(typ="safe")  # 安全模式
    yaml.preserve_quotes = True  # 保留字符串引号
    with open(path, "r", encoding="utf-8") as f:
        return yaml.load(f)

# 调用(读取后仍保留原注释)
config = load_yaml_with_comments("config.yaml")
类封装,适合大型项目
"""
# config.yaml文件内容
actor:
  model_path: "/data/actor"  # 实际值(字符串类型)
  temperature: 0.2
"""

import yaml    
from dataclasses import dataclass

# 定义配置类
@dataclass
class ModelConfig:
    model_path: str  # 这是「类型注解」,告诉解释器:model_path 应该是字符串类型
    temperature: float = 0.1  # 类型注解 + 默认值(未传参时用 0.1)

# 读取并转换为类
def load_yaml_class(path):
    with open(path, "r", encoding="utf-8") as f:
        config_dict = yaml.safe_load(f)
    # 转换为类(结构化管理)
    return ModelConfig(**config_dict["actor"])

# 调用(通过属性访问,更直观)
config = load_yaml_class("config.yaml")
print(config.model_path)  # 输出:/data/actor

类封装的核心优势:

  • 类型校验:如果 YAML 中 model_path 是数字(如 model_path: 123),运行时会报错,提前发现配置错误;
  • 属性访问:用 model_config.model_path 替代 config_dict["actor"]["model_path"] ,代码更易读;
  • 默认值兜底:如果 YAML 中没有 temperature,会自动用默认值 0.1。
多文件合并: 
import yaml

def load_multiple_yaml(paths):
    config = {}
    for path in paths:
        with open(path, "r", encoding="utf-8") as f:
            sub_config = yaml.safe_load(f)
            config.update(sub_config)  # 合并(后读的覆盖先读的)
    return config

# 调用(合并训练+模型配置)
config = load_multiple_yaml(["train_config.yaml", "model_config.yaml"])
补充,写入 yaml 文件
import yaml

# 将字典写入 YAML(保留格式)
def save_yaml(config, path):
    with open(path, "w", encoding="utf-8") as f:
        # default_flow_style=False:禁用单行列表/字典,更易读
        yaml.safe_dump(config, f, default_flow_style=False, encoding="utf-8", allow_unicode=True)

# 示例
config = {"model_path": "/data/7b", "use_vllm": True}
save_yaml(config, "new_config.yaml")

总结:常见避坑点

错误类型错误示例正确示例
冒号后无空格model_path:"/data/7b"model_path: "/data/7b"
Tab 缩进用 Tab 缩进嵌套字典用 2 个空格缩进
布尔值大写UseVLLM: Trueuse_vllm: true
相对路径问题model_path: "./models"用绝对路径:/data/models
列表元素缩进不一致- 10<br> - 5- 10<br>- 5(统一缩进)
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐