1. YAML 简介
YAML(YAML Ain’t Markup Language)是一种简洁易读的数据序列化格式,广泛用于配置文件、数据存储等场景。它支持键值对、列表、嵌套结构,易于阅读和编辑。
2. YAML 语法基础
2.1 键值对
YAML 采用 key: value
形式表示键值对,冒号后需要有一个空格。
name: John Doe
age: 30
location: Earth
2.2 缩进
YAML 使用缩进表示层级关系,通常使用两个空格,不允许使用 Tab。
person:
name: Alice
age: 25
address:
city: New York
zip: 10001
2.3 列表
使用 -
表示列表项,列表项之间需要相同缩进。
languages:
- Python
- JavaScript
- Go
也可以使用 []
表示列表:
languages: [Python, JavaScript, Go]
2.4 多行字符串
使用 |
表示保留换行符的字符串,>
表示折叠换行符。
description: |
这是一个多行字符串。
每行都会被保留。
summary: >
这也是一个多行字符串。
但换行符会被折叠。
2.4.1 去掉多行字符串的最后一行换行
如果想去掉最后的换行符,可以使用 |-
(保留换行但去掉末尾换行)或 >-
(折叠换行并去掉末尾换行)。
text1: |-
第一行
第二行
第三行
输出:
第一行
第二行
第三行
text2: >-
第一行
第二行
第三行
输出:
第一行 第二行 第三行
2.5 注释
使用 #
表示注释。
# 这是一个 YAML 文件
name: John Doe # 用户名
3. 复杂数据结构
3.1 字典(对象)
字典可以嵌套定义:
person:
name: Alice
age: 25
contact:
email: alice@example.com
phone: 123-456-7890
也可以使用 {}
语法:
person: {name: Alice, age: 25}
3.2 复杂列表
列表中可以包含字典:
employees:
- name: Alice
age: 25
- name: Bob
age: 30
4. YAML 高级特性
4.1 变量引用(锚点 & 别名 *)
YAML 允许使用 &
定义锚点,*
进行引用,避免重复数据。
defaults: &defaults
role: user
active: true
user1:
name: Alice
<<: *defaults
user2:
name: Bob
<<: *defaults
4.2 环境变量
某些 YAML 解析器支持环境变量:
database:
host: ${DB_HOST}
port: ${DB_PORT}
4.3 多文档分隔符
使用 ---
分隔多个 YAML 文档。
---
name: Alice
age: 25
---
name: Bob
age: 30
5. YAML 使用场景
- 配置管理(Kubernetes, Docker Compose, Ansible)
- 数据存储(如 API 响应、日志格式化)
- 对象序列化(如 Python 的 PyYAML 库)
6. YAML 与 JSON 互换
YAML 是 JSON 的超集,可以相互转换。
person:
name: Alice
age: 25
等同于 JSON:
{
"person": {
"name": "Alice",
"age": 25
}
}
7. YAML 解析工具
7.1 Python 解析 YAML
使用 PyYAML
库解析 YAML:
import yaml
with open("config.yaml", "r") as file:
data = yaml.safe_load(file)
print(data)
7.2 命令行解析 YAML
使用 yq
解析 YAML(类似 jq
解析 JSON):
yq eval '.person.name' config.yaml
8. 总结
YAML 是一种简洁、可读性强的数据格式,广泛应用于配置管理和数据存储。掌握 YAML 的基本语法、数据结构和解析工具,可以更高效地使用它。