赞
踩
YAML
:“YAML Ain’t Markup Language”的缩写,常用于配置文件编写,语法简洁,后缀为.yaml
或.yml
。适用于范围非常广泛,如k8s
容器编排、JAVA/PYTHON
等主流语言数据持久化、spring/mybatis
等开源框架的配置文件。
- 相同点:它们都是用来定义
结构化数据
,语法结构相似,是通用的数据序列化
语言。- 不同点:
JSON
使用冒号:
+{}
或[]
定义层级关系,YAML
则使用缩进
表示层级关系。JSON
常用于数据传输,YAML
常用于配置文件编写。yaml
更偏向于人性化。
- 大小写敏感。
- 冒号
:
后面必须跟空格。#
表示注释,支持行内注释
和单行注释
。- 使用
缩进
表示层级关系。缩进
不能使用tab,只能用空格
。- 缩进的
空格数不重要
,但相同层级的元素左侧必须对齐
。- 3个破折号
---
,表示新文档开始。- 3个点
...
,表示文档结束(可选项)。&anchor_name
:在yaml对象上创建锚点
,并为锚点取个名称anchor_name
。*anchor_name
:引用锚点anchor_name
。<<
:表示合并到当前数据,一般结合*anchor_name
使用。
1.大小写敏感和注释
# Name和name是两个yaml对象
Name: zhangsan
name: zhangsan # 行内注释
2.缩进
# 1.不能使用tab键,只能使用空格。
key:
- value1 # 空格数没有要求,不像python缩进严格需要4个空格,此处2个空格。
- value2 # 需要与value1缩进空格个数保持一致,表示同层级元素。
3.分割文档内容:---
与...
yaml文件会被加载成为一个流对象(比如IO流),在流对象中可以使用
---
表示每个文档开始的分隔符,...
作为文档结束的分隔符(可选)。
---
:通常用在多文档的yaml流中,分割指令
和文档内容
。若没有指令
,则作为文档开始的分隔符。
...
:通常用于网络传输或者流,有明确的结束符号,有利于软件处理。
# file name: yaml_stream_demo.yaml
# 表示第一个文档的前导注释
---
name: zhangsan
age: 19
...
# 第二个文档的前导注释
---
name: lisi
age: 17
...
import yaml
file_name = "yaml_stream_demo.yaml"
# 获得文件句柄
file_handle = open(file_name, "r")
# 加载在yaml解析器中
yaml_obj = yaml.load_all(file_name.read(), Loader=yaml.loader)
# 打印解析后的python对象
print(yaml_obj ) # [{'age': 19, 'name': 'zhangsan'}, {'age': 17, 'name': 'lisi'}]
4.锚点&
与引用*
、数据合并<<
# 1. 字典对象-锚点创建 --- defaults: &defaults_anchor # 创建锚点,锚点名称为defaults_anchor user: yaml host: localhost develop: database: app_development <<: *defaults_anchor # 引用锚点defaults_anchor,并将其合并到develop字典中 ... # 2. 列表元素-锚点创建 --- - &game_role Steve # 创建锚点 - Oren - *game_role # 引用锚点game_role ...
相当于:
defaults:
user: yaml
host: localhost
develop:
database: app_development
user: yaml
host: localhost
---
- Steve
- dead
- Steve
YAML
数据结构千变万化,实际上都是基于映射(哈希/字典/关联数组)
、序列(数组/列表)
和标量|纯量(字符串/数字/布尔/时间/空值)
这3种基础数据结构的演化。
1.映射(哈希/字典/关联数组)
# python
var = {"k1": "A", "k2": "B"}
# 1. yaml常规格式
var:
k1: A
k2: B
# 2. yaml内联格式
var: {k1: A, k2: B}
// json
"var": {"k1": "A", "k2": "B"}
"var": {
"k1": "A",
"k2": "B"
}
2.序列(数组/列表)
示例 1
# python
var = ["A", "B"]
# 1. yaml内联格式
var: [A, B]
# 2. yaml常规格式,连字符 -
var:
- A
- B
// json
"var": ["A", "B"]
示例 2
# python
var = [{"name": "li si", "age": 10}, {"name": "ma zi", "age": 12}]
# 1. yaml内联格式
var: [{name: li si, age: 10}, {name: ma zi, age: 12}]
# 2. yaml常规格式
var:
- {name: li si, age: 10}
- name: ma zi # 表示同一代码块{}
age: 12
// json 1
"var": [{"name": "li si", "age": 10}, {"name": "ma zi", "age": 12}]
// json 2
"var": [{
"name": "li si",
"age": 10
},
{
"name": "ma zi",
"age": 12
}]
3.标量|纯量(字符串/数字/布尔/时间/空值)
标量是最yaml基本的数据类型,不可再分的值。比如:字符串、布尔值、数字、空值、时间戳、
--- # 1. 单行字符串 my_strings1: # 将标量映射到序列对象my_strings - hello # hello就是字符串标量 - hello world # hello world是字符串标量,通常不需要使用引号包裹。 - "hello \r\r" # 使用转义字符"\"的字符串,需要双引号包裹。 --- # 2. 多行字符串-保留换行:|。去掉每行的缩进和行尾空白,保留换行和额外缩进。 my_strings2: | 第1行定义缩进空格 第2行保留换行符 第3行保留4个空格 最后一行 // json "my_strings2": "第1行定义缩进空格\n第2行保留换行符\n 第3行保留4个空格\n最后一行" --- # 3. 多行字符串-折叠换行:>。将换行转换为空格,将空白行转换为换行。 my_strings3: > 第1行定义缩进空格 第2行 最后一行 // json "my_strings3": "第1行定义缩进空格 第2行 最后一行" # + 表示保留字符串行末尾的换行,- 表示删除字符串末尾的换行。与>或者|结合使用。 --- E 4. 多行字符串 + my_strings4: |+ 第1行定义缩进空格 第2行 最后一行 // json "my_strings4": "第1行定义缩进空格 第2行 最后一行\n" --- E 5. 多行字符串 - my_strings5: |- 第1行定义缩进空格 第2行 最后一行 // json "my_strings5": "第1行定义缩进空格 第2行 最后一行"
my_boolean: # 将标量映射到序列对象my_boolean
- true # True/true 就是字符串标量,表示 真。
- false # False/false 表示 假。
- yes # Yes/yes 表示 真。
- no # No/no 表示 假。
// json
"my_boolean": [true, false]
my_int: # 将标量映射到序列对象my_int
- 123 # 整数标量
- 0o14 # 八进制标量
- 0xC # 十六进制标量
- 0010_1010 # 二进制标量
// json
"my_int": [123, 42]
my_float:
- 3.14 # 浮点数标量
- 3.63e+5 # 科学技术标量
- -.inf # 负无穷大标量
- .NaN # 非数字标量
my_null:
-
- null
- Null
- ~
my_data1: 2024-03-26 # 必须ISO 8601格式,即yyyy-MM-dd。
my_data2: 2024-03-26T05:00:00+08:00 # 使用ISO 8601格式,用T连接时间和日期,用+代表时区
通常在应用yaml
时,一些主流应用会在yaml基础语法
的基础上,拓展很多语法糖。如helm语法
,拓展了内置对象Release|Values|Chart|Template
。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。