python常识系列02-->YAML文件语法及示例

前言

时间就像海绵里的水,只要愿挤,总还是有的。——鲁迅
   今天乌天黑地,就来了几点雨,上了一天课,嗓子不舒服了。来打打字,活跃活跃手。

一、YAML文件是什么

  • YAML是 "YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写;
  • 实际上YAML还是一种标记语言,只不过是更加聚焦于数据的标记语言(上面是大佬们的文字游戏);
  • YAML也是可以用来编写配置文件的语言,语法非常简洁和强大;
  • 在自动化测试框架中,常应用于自动化测试过程,用来进行数据驱动的数据存储载体,如典型的httprunner。(因为笔者是这个领域)

二、YAML语法规则

  • 大小写敏感
  • 使用缩进表示层级关系
  • 不允许使用 TAB 键来缩进,只允许使用空格键来缩进
  • 缩进的空格数量不重要
  • 使用"#"来表示注释

其中规则中的1、2、5有没有觉得和python类似

三、YAML文件支持的数据格式

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

四、YAML文件编写示例

  • 4.1 对象
name: 小王
age: 12
books: 
  book1: 朝花夕拾
  book2: 呐喊

使用冒号(:)表示键值对,同一缩进的所有键值对属于一个map

  • 4.2 数组
-
  - A
  - B
  - C
-
  - D
  - E
  - F

使用(- ) 表示数组,同一缩进的所有项属于一个数组

  • 4.3 纯量
name: 'xiaoli'
age: 22
weight: 57.30
isStudent: true
address: ~ 
time: 2001-12-14t21:59:43.10-05:00 
date: 1976-07-31

根据以上纯量的例子,由上往下,纯量包含:字符串 整数 浮点数 布尔值 Null(用~表示) 时间 日期
其中:用~表示null ; 时间、日期采用IS08601格式

  • 4.4 对象嵌套数组
hobbys:
 - 'climb mountains'
 - sing
 - dance
  • 4.5 数组嵌套对象
-
  id: 1
  name: xiaowang
-
  id: 2
  name: xiaoli

五、YAML文件常用编写语法整理

  • 在一个yml文件中,使用 --- 来表示一段文档(或者一组配置)的开始,使用 ... 来表示一段文档的结束。如果yml中只有一组配置,则可以省略掉 ---
  • 使用 - 来表示单个的列表项
  • 使用 : 来表示键值对
  • 用 ~ 表示null
  • 使用 ! 和 !! 来做强制类型转换
  • 单引号会将字符串里面的特殊字符转义为字符串处理
  • 双引号不会转义字符串里面的特殊字符,特殊字符作为本身想表示的意思
  • 使用|标注的文本内容缩进表示的块,可以保留块中已有的回车换行
  • 使用+表示保留文字块末尾的换行
  • 使用-表示删除字符串末尾的换行
  • 使用 > 标注的文本内容缩进表示的块,会将块中回车替换为空格,最终连接成一行
  • 使用true或false表示布尔值
  • 使用 & 定义数据锚点(即要复制的数据)
  • 使用 * 引用锚点数据(即数据的复制目的地)
    ps: 语法比较多,大家当参考资料看吧,到时有更多用上了,我再补充
<think> 我们正在讨论如何使用Python运行train.py脚本并传入config.yaml配置文件。用户可能需要知道运行方法、报错解决方案或代码功能解释。 由于用户没有提供具体的错误信息,我们将提供一般性的指导。 常见场景: 1. 在命令行中运行脚本并传入配置文件。 2. 在train.py中如何解析yaml配置文件。 3. 可能遇到的常见错误及解决方案。 我们将分步骤解释: ### 1. 运行命令 通常,我们会使用命令行运行Python脚本并传入配置文件的路径。例如: ```bash python train.py --config config.yaml ``` 或者 ```bash python train.py -c config.yaml ``` 这取决于`train.py`中是如何解析命令行参数的。 ### 2. 在train.py中解析命令行参数和配置文件 在`train.py`中,我们通常会使用`argparse`库来解析命令行参数,然后使用`yaml`库来加载配置文件示例代码(train.py中可能包含的代码): ```python import argparse import yaml # 设置命令行参数解析 parser = argparse.ArgumentParser(description='Training script.') parser.add_argument('--config', '-c', type=str, required=True, help='Path to the config file.') args = parser.parse_args() # 加载配置文件 with open(args.config, 'r') as f: config = yaml.safe_load(f) # 然后就可以使用config字典中的配置项了 # 例如:learning_rate = config['learning_rate'] ``` ### 3. 可能遇到的问题及解决方案 #### 问题1: 无法找到配置文件 **错误信息**:`FileNotFoundError: [Errno 2] No such file or directory: 'config.yaml'` **原因**:配置文件路径错误。 **解决**: - 确保配置文件存在于指定的路径。 - 使用绝对路径或相对路径正确指定。 #### 问题2: 配置文件解析错误 **错误信息**:`yaml.scanner.ScannerError` 或其他解析错误。 **原因**:配置文件格式不符合YAML语法。 **解决**: - 检查YAML文件语法,例如缩进、冒号后的空格等。 - 可以使用在线YAML验证工具检查。 #### 问题3: 配置项缺失 **错误信息**:`KeyError: 'learning_rate'` **原因**:在代码中使用了配置文件中不存在的键。 **解决**: - 检查配置文件是否包含所需的键。 - 在代码中提供默认值,例如:`config.get('learning_rate', 0.001)` #### 问题4: 未安装PyYAML库 **错误信息**:`ModuleNotFoundError: No module named 'yaml'` **解决**:安装PyYAML库。 ```bash pip install PyYAML ``` ### 4. 进阶:配置文件的灵活使用 有时,我们可能希望通过命令行参数覆盖配置文件中的某些设置。这可以通过以下方式实现: - 在`argparse`中定义更多参数,然后更新配置字典。 - 例如: ```python parser.add_argument('--learning_rate', type=float, default=None, help='Override learning rate in config.') args = parser.parse_args() if args.learning_rate is not None: config['learning_rate'] = args.learning_rate ``` 以上是一般性的指导。如果用户有具体的错误信息,可以提供更具体的解决方案。 现在,根据要求生成相关问题: </think> ### Python运行train.py脚本并传入config.yaml配置文件指南 #### 1. **基本运行方法** ```bash python train.py --config config.yaml # 或使用短参数 python train.py -c config.yaml ``` - 需要在`train.py`中实现参数解析逻辑(通常使用`argparse`或`click`库) - 配置文件路径支持绝对路径(`/path/to/config.yaml`)或相对路径(`../configs/config.yaml`) #### 2. **配置文件解析代码示例** ```python # train.py 核心解析代码 import yaml import argparse parser = argparse.ArgumentParser() parser.add_argument('--config', '-c', type=str, required=True) args = parser.parse_args() with open(args.config, 'r') as f: config = yaml.safe_load(f) # 安全加载YAML # 使用配置参数 learning_rate = config['training']['lr'] batch_size = config['data']['batch_size'] ``` #### 3. **常见报错解决方案** | 错误类型 | 原因 | 解决方案 | |---------|------|---------| | `FileNotFoundError` | 路径错误 | 使用`os.path.abspath()`转换路径 | | `yaml.scanner.ScannerError` | YAML语法错误 | 检查缩进和冒号空格,推荐[YAML验证工具](https://yamlvalidator.com) | | `KeyError: 'training'` | 配置项缺失 | 添加默认值:`config.get('training', {})` | | `ModuleNotFoundError: yaml` | 依赖缺失 | `pip install pyyaml` | | `TypeError: string indices must be integers` | 多层嵌套错误 | 使用`config['section']['subsection']`访问 | #### 4. **最佳实践建议** 1. **配置验证**:使用`pydantic`库验证配置结构 ```python from pydantic import BaseModel class TrainConfig(BaseModel): lr: float epochs: int ``` 2. **环境变量覆盖**:支持`${ENV_VAR}`语法(需使用`os.path.expandvars`) 3. **多配置文件合并**: ```bash python train.py -c base.yaml -c override.yaml ``` 4. **动态更新**:通过命令行覆盖配置 ```bash python train.py -c config.yaml --lr 0.01 ``` #### 5. **调试技巧** - 打印完整配置:`print(yaml.dump(config))` - 使用`python -m pdb train.py -c config.yaml`进入调试器 - 日志记录配置加载过程: ```python import logging logging.basicConfig(level=logging.INFO) logging.info(f"Loaded config: {config}") ``` > 当配置文件较大时,建议使用层级结构组织参数,例如: > ```yaml > training: > lr: 0.001 > optimizer: adam > data: > batch_size: 64 > augmentation: true > ``` > 这能显著提高可维护性并减少错误[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挨踢~小先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值