YAML 基础语法与编写规范详解

YAML 基础语法与编写规范详解

YAML(YAML Ain't Markup Language)是一种人性化的数据序列化语言,专为方便人类读写而设计。它常用于配置文件(如 Spring Boot、Kubernetes、Docker Compose 等)以及数据交换场景。

本文将详细介绍 YAML 的核心语法、数据结构及编写规范。

1. 核心规则:缩进与格式

YAML 通过缩进来表示层级关系,这是其最显著的特征,也是新手最容易出错的地方。

  • 严格使用空格缩进严禁使用 Tab 键。不同的编辑器对 Tab 的解析可能不同,混用 Tab 和空格会导致解析器报错。
  • 层级一致性:同一层级的元素必须保持相同的缩进空格数(通常建议使用 2 个或 4 个空格)。
  • 大小写敏感 :YAML 对键名的大小写敏感,Keykey 是两个不同的标识符。

2. 基本数据结构

2.1 对象/映射

使用 key: value 的形式,冒号后必须跟一个空格。

yaml 复制代码
# 简单键值对
path: E:/py_projects/datasets
# 嵌套对象(通过缩进实现)
train:
  images: images/train
  labels: labels/train

2.2 列表/数组

使用短横线加空格 - 开头,表示数组中的一个元素。

yaml 复制代码
# 列表写法
names:
  - Falling
  - Kneeling
  - Sitting

关键概念辨析

原内容中提到的"显式编号形式"实际上是 映射 结构,而非列表。

yaml 复制代码
# 这不是列表,而是一个键为数字的映射
names:
  0: Falling
  1: Kneeling

在 Python 中,前者会被解析为 list (['Falling', 'Kneeling']),后者会被解析为 dict ({0: 'Falling', 1: 'Kneeling'})。请根据实际业务需求(如 YOLO 标签字典)选择正确的结构。

2.3 流式风格

YAML 也支持类似 JSON 的内联写法(Flow Style),但在配置文件中通常推荐使用上述的块风格以保持可读性。

yaml 复制代码
# 内联列表
list: [a, b, c]
# 内联映射
map: { key1: value1, key2: value2 }

3. 字符串与注释

3.1 字符串规则

  • 默认情况下,字符串不需要引号
  • 包含特殊字符(如 :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, `````)或以特殊字符开头时,必须使用单引号或双引号包裹。
yaml 复制代码
name: Hard Hat          # 无需引号
title: "Hello: World"   # 包含冒号,需引号包裹
path: 'E:\user\docs'    # 包含反斜杠等路径,建议引号包裹

3.2 注释

# 开头,解析器会忽略从 # 开始到行尾的内容。

yaml 复制代码
# 这是整行注释
nc: 6  # 这是行尾注释,常用于解释参数含义

4. 数据类型支持

YAML 支持自动类型推断,无需显式声明类型。

yaml 复制代码
is_valid: true    # 布尔值
count: 100        # 整数
price: 19.99      # 浮点数
parent: ~         # 空值,等同于 Python 的 None

5. 文档分隔符

  • ---:用于在单个文件中分隔多个 YAML 文档。
  • ...:用于标记文档的结束(通常可省略)。
yaml 复制代码
---
# 第一份文档配置
server:
  port: 8080
---
# 第二份文档配置
database:
  host: localhost

6. 实战案例解析

以下是一个典型的目标检测任务配置文件(如 YOLO 格式),展示了上述语法的综合应用:

yaml 复制代码
# 数据集根目录
path: E:/py_projects/safe2/datasets
# 相对于 path 的图像路径
train: images/train
val: images/val
test: images/test
# 类别定义
nc: 6  # 类别数量
# 类别名称映射 (映射结构:键为索引,值为名称)
names:
  0: Falling
  1: Kneeling
  2: Sitting
  3: Sleeping
  4: Standing
  5: Unknown

结构解读

  1. path, train, val, test 为字符串键值对。
  2. nc 为整型数值。
  3. names 是一个映射,用于存储类别索引与名称的对应关系。

💡 总结与最佳实践

要点 说明
缩进 仅使用空格,禁止 Tab 键。
结构选择 列表用于有序数据,映射用于键值对应(如 ID:名称)。
引号使用 除非包含特殊字符或产生歧义,否则无需为字符串加引号。
可读性优先 配置文件应优先考虑可读性,避免过度使用内联写法。
相关推荐
亓才孓1 小时前
[Spring测试]TestRestTemplate
java·后端·spring
逆光的July2 小时前
扫码登录的设计与实现
java
Miqiuha2 小时前
工作答辩框架
java·开发语言
happymaker06262 小时前
Java学习日记——DAY25(JavaSE完结)
java·开发语言·学习
CHANG_THE_WORLD2 小时前
C++指针与引用:从语法到底层的全面剖析
java·数据结构·c++
HAPPY酷2 小时前
Visual Studio C++ 项目“添加现有项“避坑指南
java·c++·visual studio
追随者永远是胜利者2 小时前
(LeetCode-Hot100)33. 搜索旋转排序数组
java·算法·leetcode·职场和发展·go
计算机毕设vx_bysj68692 小时前
计算机毕业设计必看必学~基于SpringBoot校园招聘系统的设计与实现,原创定制程序、单片机、java、PHP、Python、小程序、文案全套、毕设成品等!
java·spring boot·mysql·课程设计