YAML,另一种标记语言?不止是标记语言!
早先的文章《Kubernetes入门实践--部署运行Go项目》里我们使用YAML
定义了Deployment
对象,Kubernetes
推荐的使用方式也是用一个YAML
文件来描述你所要部署的 API
对象。然后统一使用kubectl apply
命令完成对这个对象的创建和更新操作。YAML
是一种序列化语言,它通常被用作配置文件的一种格式。除了在Kubernetes
项目以外像Docker-Compose
、Gitlab CI/CD
项目的配置文件使用的也是YAML
格式。通过这些在技术领域的明星项目也能反映出YAML
在过去几年里的流行度。
这篇文章我们就详细地对YAML
做一下入门,后面学习Kubernetes
的过程中需要自己动手写那些API
对象的声明配置文件时也好拿这个教程做个参考。
YAML
是"Yet Another Markup Language"(另一种标记语言)的缩写。但后来项目的维护者将其重命名成了"YAML Ain‘t Markup Language"(YAML 不止是标记语言),以更加强调其面向数据的特性。所以你看,文章的标题,并不是我想标题党,是我真不知道起啥标题好才拿过来用的~。
一个简单的YAML文件
让我们先来看一个YAML
文件的示例,做一个简要的概述。
--- doe: "a deer, a female deer"ray: "a drop of golden sun"pi: 3.14159xmas: truefrench-hens: 3calling-birds: - huey- dewey- louie- fredxmas-fifth-day: calling-birds: fourfrench-hens: 3golden-rings: 5partridges: count: 1location: "a pear tree"turtle-doves: two
文件以三个短横线开头。这些短横线表示新YAML
文档的开始。YAML
支持在单个文件里存放多个文档,解析器会将每组短横线识别为新文档的开始。
接下来,我们将看到构成大部分典型YAML
文档的常用结构:键-值对。Doe
是一个指向字符串值"a deer, a female deer."
的键。
YAML
支持的不仅仅是字符串值。上面的文件以六个键-值对开始。它们的值有四种不同的数据类型。键doe
和ray
的值都是字符串。pi
是一个浮点数。xmas
是一个布尔值。french-hens
是一个整数。可以用单引号或双引号将字符串括起来,也可以根本不用引号。YAML
将无引号的数字识别为整数或浮点数。
第七项是个数组。calling-birds
有四个元素,每个数组元素都由一个短横线开头。
我用两个空格缩进了calling-birds
中的元素。缩进是YAML
表示嵌套的方式。空格缩进的数量可以因文件而异,相同层级的元素左侧对齐即可,但是不允许使用Tab
制表符。
最后,我们看到xmas-fifth-day
,里面还有五个元素,每个元素都缩进了。我们可以将xmas-fifth-day
视为包含两个字符串、两个整数和另一个字典值的字典。YAML
支持这种键值嵌套和混合类型。
在我们深入研究YAML
之前,让我们先看看这个文档用JSON
表示是什么样子。可以在百度或者Google
上搜一下YAML
转JSON
的网页工具,这类工具有很多。
{"doe": "a deer, a female deer","ray": "a drop of golden sun","pi": 3.14159,"xmas": true,"french-hens": 3,"calling-birds": ["huey","dewey","louie","fred"],"xmas-fifth-day": {"calling-birds": "four","french-hens": 3,"golden-rings": 5,"partridges": {"count": 1,"location": "a pear tree"},"turtle-doves": "two"}
}
缩进和空白符
空白符是YAML
格式的一部分,其中换行符表示字段的结束,缩进用于组织YAML文档的结构,用来表示文档的层级或者叫嵌套关系。不过YAML
值允许使用空格符进行缩进,不允许使用制表符Tab
键,这是因为不同的工具对待制表符的方式不同。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,比如下面这个文档,因为同级元素未对齐,在解析器里会报错
foo: barpleh: helpstuff:foo: barbar: foo
所以总结下来记住下面四点即可:
换行符表示字段的结束。
使用缩进表示层级关系。
缩进时不允许使用制表符Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
注释
YAML
中的注释以#
号开头。它们可以出现在字段值之后,也可以占据整行。
___
# This is a full line comment
foo: bar # this is a comment, too
YAML数据类型
键-值对是YAML
的基本构建块。YAML
文档中的每一项都是至少一个字典的成员。键的类型始终是字符串。
YAML
的键-值对中的值是标量。它们的表现行为类似于Javascript
和Python
等语言中的标量类型。通常我们只要记住将字符串括在引号中,数字不加引号就足够了,解析器会自动解析出值的类型。
下面我们就详细看一下YAML
的值都支持哪些数据类型,我们先从数组和字典这两种符合类型说起,然后再逐步拆解看里面的普通类型。一般看完这两种复合类型就可以掌握YAML
的基本用法,上手编写和修改YAML
文档了。
数组
YAML
的数组可以写在一行里
items: [ 1, 2, 3, 4, 5 ]
names: [ "one", "two", "three", "four" ]
也可以写在多行里,每一行指定一个元素
---
items:- 1 - 2 - 3- 4 - 5
names:- "one"- "two"- "three"- "four"
多行格式对于包含复杂对象的列表非常有用。
___
items:- things:thing1: hueythings2: deweything3: louie- other things:key: value
数组可以包含任何有效的YAML
值。同一个数组中的值不必是同一类型。
字典
与数组一样,可以将字典放入单行内。我们在上面看到了这种格式。类型Python
打印字典的格式:
---
foo: { thing1: huey, thing2: louie, thing3: dewey }
也见过在多行里指定字典元素的格式:
---
foo: bar
bar: foo
当然字典也可以自由嵌套,并且持有任何有效的YAML
值。
---
foo:bar:- bar- rab- plop
数字类型
YAML
可以识别数字类型。我们在上面看到了浮点和整数。YAML
还支持其他几种数字类型。
整数可以用十进制、十六进制或八进制表示,Ox表示一个值是十六进制的,前导零表示一个八进制值。
foo: 12345bar: 0x12d4plop: 023332
转换成JSON
后整数都是十进制表示的
{"foo": 12345,"bar": 4820,"plop": 9946
}
YAML
既支持固定浮点数,也支持指数浮点数。
foo: 1230.15bar: 12.3015e+05
最后YAML
里也可以表示正负无穷和非数字NaN
(Not a Number的缩写)
foo: .inf
bar: -.Inf
plop: .NAN
字符类型
YAML
的字符串为Unicode
编码。在大多数情况下,不必用引号将它们括起来。
foo: this is a normal string
但是如果我们想要处理转义序列,我们需要使用双引号的字符串。
foo: "this is not a normal string\n"
bar: this is not a normal string\n
YAML
将上面第一个值处理为以回车符和换行符结尾。由于第二个值未加引号,因此YAML
将\n
视为两个普通的字符。
foo: this is not a normal string
bar : this is not a normal string\n
YAML
不会对使用单引号的字符串进行转义,但是单引号可以避免将字符串内容解释为文档格式。
字符串值可以写在多行里。使用大于号,可以指定字符串块。
bar: >this is not a normal string itspans more thanone linesee?
但是解析器会把他们解析成单行字符串:
bar : this is not a normal string it spans more than one line see?
如果想让YAML
把上面的字符串也解析成多行的,需要使用管道符 |
bar: |this is not a normal string itspans more thanone linesee?
Null
YAML
里用波浪号~
或者不带引号的null
直接表示空值。
foo: ~
bar: null
布尔值
YAML
用关键字True
、On
和Yes
表示真。用False
、Off
或No
表示假。
---
foo: True
bar: False
light: On
TV: Off
高级选项
多文档
YAML
文档以三个短横线开始,以三个英文句号结束。一些YAML
处理程序会强制要求文档以三个短横线开始,结束运算符通常是可选的。例如,Java
的Jackson
不会在没有开始的情况下处理YAML
文档,但是Python
的PyYAML
会。
当一个文件包含多个文档时,通常使用文档结束操作符。比如下面这个例子
---
bar: foo
foo: bar
...
---
one: two
three: four
使用下面的Python
脚本解析这个YAML
文件:
import yamlif __name__ == '__main__':stream = open("foo.yaml", 'r')dictionary = yaml.load_all(stream)for doc in dictionary:print("New document:")for key, value in doc.items():print(key + " : " + str(value))if type(value) is list:print(str(len(value)))
脚本会解析出YMAL
文件里的两个文档对象:
New document:
bar : foo
foo : bar
New document:
one : two
three : four
总结
YAML
是一种功能强大的语言,可用于配置文件、应用程序之间的消息和保存应用程序状态。我们介绍了它最常用的特性,包括如何使用内置数据类型和构造复杂文档。它还支持自定义函数、正则表达式这样的高级功能。后面学习Kubernetes
的过程中需要自己动手写那些API
对象的声明配置文件时可以拿这个教程做个参考。
参考链接
YAML tutorial get started
YAML1.2规范
- END -
关注公众号,获取更多精选技术原创文章
YAML,另一种标记语言?不止是标记语言!相关推荐
- (自创) 一种新的轻量级文本标记语言 - MarkOwl
设计目标 语法优雅 标记简洁 & 易于书写 语法健全. 不能出现自相矛盾, 漏洞百出, 解释不清的地方 标记含义明确, 不要有歧义 标记不可以对正文文字造成视觉干扰 (不能让阅读者看着眼花缭乱 ...
- HTML超文本描述语言,HTML超文本标记语言的介绍
一.概念 1.定义 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中的各个部分. 简而言之:一种为普通文件中某些字句加上标示的语言,其目的在 ...
- html(+css)/01/html语言基础,标记,标记语法,html文档结构
厚积薄发 html(+css)/01/html语言基础,标记,标记语法,html文档结构 工资:4500元左右/月 最好的学习html的方法,就是多参考别人的网页源代码: 查看源代码: 1,打开网页/ ...
- java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?
关注.星标公众号,不错过精彩内容 整理/排版:付斌 转自:嵌入式ARM 01 为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过 ...
- window直接运行不需要环境的软件是什么语言开发的_C语言为何不会过时?你需要掌握多少种语言?_C 语言...
01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在 ...
- python 语句块标记_什么是python中的语言语句块标记
什么是python中的语言语句块标记 发布时间:2020-07-16 10:05:20 来源:亿速云 阅读:172 作者:Leah 什么是python中的语言语句块标记?很多新手对此不是很清楚,为了帮 ...
- 认识标记语言html,认识标记语言HTML课件
认识标记语言HTML课件 阿迪达斯三条纹标志是由阿迪达斯的创办人阿迪·达斯勒设计的,三条纹的阿迪达斯标志代表山区,指出实现挑战.成就未来和不断达成目标的愿望. 第二章 第五节 阿迪达斯三条纹标志是由阿 ...
- c语言注释的开始标记符和结束标记符分别为,C语言程序设计填空题
C语言程序设计填空题Tag内容描述: 1.面向对象程序设计期末综合练习二 填空题 填空题 1 C 语言是在 语言的基础上发展起来的 2 C 语言的编译单位是扩展名为 的 文件 3 行尾使用注释的开始标 ...
- 随机森林c语言编程,一种基于随机森林的C语言源代码静态评分方法与流程
本发明涉及评分领域及机器学习领域,它特别涉及一种基于随机森林的c语言源代码静态评分的构建方法. 背景技术: c语言源代码静态评分是指对根据一定的题目描述做出解答的c语言源代码进行评分.目前,主要流行的 ...
最新文章
- 【RocketMQ工作原理】消息的消费
- 构建城市大脑的未来标准,9个值得探索的规范
- 自学python还是报班-零基础学Python是应该报课还是自学?
- asp程序错误详细说明例表
- python封装函数、实现将任意的对象序列化到磁盘上_Python系列之lambda、函数、序列化...
- HTML标签语义化——使用b标签,还是strong标签
- boost官方文档同步机制Synchronization mechanisms overview
- 用python批量执行VBA代码
- 操作系统考研辅导教程(计算机专业研究生入学考试全真题解) pdf,计算机组成原理考研辅导教程:计算机专业研究生入学考试全真题解...
- nuxt.js 引入第三方插件报window is not defined
- SAP License:如何获取采购订单一次性供应商的地址信息
- 17个品牌,113款5G手机,你选哪款?
- 如何发布自己的 Composer 包
- linux 发送at指令,AT指令发送短信流程
- 微信端input输入框在ios手机上连续输入卡顿
- python搬家具_Python语言之学会Python之后!亲朋好友都夸我厉害!用Python买到最优惠的家具...
- 小薛读论文04:预测、解决方案与滚动时域 (UTD24期刊MSOM重要综述)
- 苹果app的几种发布方式
- 值得收藏的 5 款iPhone 数据恢复软件
- 多传感器融合定位七-惯性导航解算及误差分析其一
热门文章
- 《HTML5 2D游戏编程核心技术》——第2章,第2.3节使用CSS背景
- jQuery的无new实例化
- server2008密码不满足密码策略的要求,检查最小密码长度、密码复杂性和密码历史的要求”的解决办法...
- 一位 女生在第一次应聘软件开发工作时成功被淘汰的例子
- 新手学信息检索4:向量空间模型与相似度计算
- 转载java中synchronized用法
- 端口映射原理,公网,内网,NA
- 查找系列合集-二分查找
- VirtualBox下安装MacOS11
- “针对即席工作负荷进行优化”如何影响你的计划缓存