Yaml语法使用
YAML概要
1. 认识 YAML
YAML是一个类似 XML、JSON 的标记性语言。YAML 强调以数据为中心,并不是以标识语言为重点。因而 YAML 本身的定义比较简单,号称“一种人性化的数据格式语言”。
它的基本语法规则如下:
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
1.1 YAML 的设计目标:
容易阅读
可用于不同程序间的数据交换
适合描述程序所使用的数据结构,特别是脚本语言
丰富的表达能力与可扩展性
易于使用
1.2 YAML 与 XML、JSON
YAML 与 XML
具有 XML 同样的优点,但比 XML 更加简单、敏捷等
YAML 与 JSON
JSON 可以看作是 YAML 的子集,也就是说 JSON 能够做的事情,YAML 也能够做
YAML 能表示得比 JSON 更加简单和阅读,例如“字符串不需要引号”。所以 YAML 容易可以写成 JSON 的格式,但并不建议这种做
YAML 能够描述比 JSON 更加复杂的结构,例如“关系锚点”可以表示数据引用(如重复数据的引用)。
1.3 YAML 组织结构
YAML 文件可以由一或多个文档组成(也即相对独立的组织结构组成),文档间使用“---”(三个横线)在每文档开始作为分隔符。同时,文档也可以使用“...”(三个点号)作为结束符(可选)。如下图所示:

如果只是单个文档,分隔符“---”可省略。
每个文档并不需要使用结束符“...”来表示结束,但是对于网络传输或者流来说,作为明确结束的符号,有利于软件处理。(例如不需要知道流关闭就能知道文档结束)
文件读取:
- 单个文件读取load()
#test.yaml
---
name: James
age: 20# -*- coding: utf-8 -*-
import yaml
file_path = data/test.ymlfile = open(file_path, 'r', encoding='utf-8')
ys = yaml.load(file.read(), Loader=yaml.Loader)
print ys 输出:{'age': 20, 'name': 'James'} - 将多个文档写在同一个yaml文件中,这时候我们就得用到我们的
load_all()方法出场了,load_all()方法会生成一个迭代器,可以用for输出出来:#test.yaml
---
name: James
age: 20
---
name: Lily
age: 19# -*- coding: utf-8 -*-
import yamlfile_path = data/test.yml
file = open(file_path, 'r', encoding='utf-8') ys = yaml.load_all(file.read(), Loader=yaml.Loader)
for y in ys:
print y 输出: {'age': 20, 'name': 'James'} {'age': 19, 'name': 'Lily'}# -*- coding: utf-8 -*-
import yaml file_path = data/test.yml
file = open(file_path, 'r', encoding='utf-8')
print(list(yaml.load_all(file.read(), Loader=yaml.Loader))) 输出:
[{'age': 20, 'name': 'James'}, ['Lily', 19]]对应的也有
dump_all()方法,一个意思,就是将多个段输出到一个文件中,如:# -*- coding: utf-8 -*-
import yaml obj1 = {"name": "James", "age": 20}
obj2 = ["Lily", 19] with open('test.yaml', 'w') as f:
yaml.dump_all([obj1, obj2], f)打开test.yaml看看:
{age: 20, name: James}
--- [Lily, 19]dump()和dump_all()方法可以传入列表,也可以传入一个可序列化生成器,如range(10), 如下:# -*- coding: utf-8 -*-
import yaml y = yaml.dump(range(10))
print y 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
YAML 认为数据由以下三种结构组成:(每个文档由三种结构混合组成)
标量 (相当于数据类型)
序列 (相当于数组和列表)
键值表(相当于 Map 表)
Yaml编写规范
规范一:文档使用 Unicode 编码作为字符标准编码,例如 UTF-8
规范二:使用“#”来表示注释内容
# 客户订单
date: 2015-02-01
customer:
- name: Jai
items:
- no: 1234 # 订单号
- descript: cpu
规范三:使用空格作为嵌套缩进工具。通常建议使用两个空格缩进,不建议使用 tab (甚至不支持)
规范四:序列表示
1、使用“-”(横线) + 单个空格表示单个列表项
--- # 文档开始
- 第一章 简介
- 第二章 设计目录
2、使用"[]"表示一组数据
--- # 文档开始
[blue, red, green]
3、组合表示。每个结构都可以嵌套组成复杂的表示结构
--- # 文档开始
- [blue, red, green] # 列表项本身也是一个列表
- [Age, Bag]
- site: {osc:www.oschina.net, baidu: www.baidu.com} # 这里是同 键值表 组合表示
规范五:键值表
1、使用 “:”(冒号) + 空格表示单个键值对
# 客户订单
date: 2015-02-01
customer:
- name: Jai
items:
- no: 1234 # 订单号
- descript: cpu
- price: ¥800.00
2、使用"{}"表示一个键值表
# 客户订单
date: 2015-02-01
customer:
- name: Jai
items: {no: 1234, descript: cpu, price: ¥800.00}
3、"? " 问号+空格表示复杂的键。当键是一个列表或键值表时,就需要使用本符号来标记
# 使用一个列表作为键
? [blue, reg, green]: Color
# 等价于
? - blue
- reg
- gree
: Color
4、组合表示。每个结构都可以嵌套组成复杂的表示结构
Color:
- blue
- red
- green # 相当于 (也是 JSON 的表示)
{Color: [blue, red, green]}
div:
- border: {color: red, width: 2px}
- background: {color: green}
- padding: [0, 10px, 0, 10px]
# 使用缩进表示的键值表与列表项
items:
- item: cpu
model: i3
price: ¥800.00
- item: HD
model: WD
price: ¥450.00
# 上面使用 “-” 前导与缩进来表示多个列表项,相当于下面的JSON表示
items: [{item:cpu, model:i3, price:¥800.00}, {item:HD, model:WD, price: ¥450.00}]
规范六:文本块
1、使用 “|” 和文本内容缩进表示的块:保留块中已有的回车换行。相当于段落块
# 注意 ":" 与 "|" 之间的空格
yaml: |
JSON的语法其实是YAML的子集,大部分的JSON文件都可以被YAML的解释器解释。
如果你想更深入的学习YAML,我建议你去 http://www.yaml.org 看看
2、使用 “>” 和文本内容缩进表示的块:将块中回车替换为空格,最终连接成一行
# 注意 ":" 与 ">" 之间的空格,另外可以使用空行来分段落
yaml: >
JSON的语法其实是YAML的子集,
大部分的JSON文件都可以被YAML的解释器解释。
如果你想更深入的学习YAML,我建议你去 http://www.yaml.org 看看
3、使用定界符“”(双引号)、‘’(单引号)或回车表示的块:最终表示成一行
yaml: # 使用回车的多行,最终连接成一行。
JSON的语法其实是YAML的子集,
大部分的JSON文件都可以被YAML的解释器解释。
yaml: # 使用了双引号,双引号的好处是可以转义,即在里面可以使用特殊符号
"JSON的语法其实是YAML的子集,
大部分的JSON文件都可以被YAML的解释器解释。"
4、当数据中含有空格或任意特殊字符,需要使用引号来包裹任何包含冒号的哈希值, 像这样:
foo: "somebody said I should put a colon here: so I did" # 然后这个冒号将会被结尾.
规范七:数据类型的约定
1、对一些常用数据类型的表示格式进行了约定,包括:
integer: 12345 # 整数标准形式
octal: 0o34 # 八进制表示,第二个是字母 o
hex: 0xFF # 十六进制表示 float: 1.23e+3 # 浮点数
fixed: 13.67 # 固定小数
minmin: -.inf # 表示负无穷
notNumber: .NaN # 无效数字 null: # 空值
boolean: [true, false] # 布尔值
string: ‘12345‘ # 字符串 date: 2015-08-23 # 日期
datetime: 2015-08-23T02:02:00.1z # 日期时间
iso8601: 2015-08-23t21:59:43.10-05:00 # iso8601 日期格式
spaced: 2015-08-23 21:59:43.10 -5 # ?
2、“!”(叹号)显式指示类型,或自定义类型标识。单叹号通常是自定义类型,双叹号是内置类型,例如:
isString: !!str 2015-08-23 # 强调是字符串不是日期数据
picture: !!binary | # Base64 图片
R0lGODlhDAAMAIQAAP//9/X
17unp5WZmZgAAAOfn515eXv
Pz7Y6OjuDg4J+fn5OTk6enp
56enmleECcgggoBADs=
#下面是内置类型
!!int # 整数类型
!!float # 浮点类型
!!bool # 布尔类型
!!str # 字符串类型
!!binary # 也是字符串类型
!!timestamp # 日期时间类型
!!null # 空值
!!set # 集合
!!omap, !!pairs # 键值列表或对象列表
!!seq # 序列,也是列表
!!map # 键值表
#下面是一些例子:
--- !!omap
- Mark: 65
- Sammy: 63
- Key: 58
--- !!set # 注意,“?”表示键为列表,在这里列表为 null
? Mark
? Sammy
? Key
# 下面是自定义的类型或标识
%TAG ! tag:clarkevans.com,2002: # % 是指令符号
--- !shape
# Use the ! handle for presenting
# tag:clarkevans.com,2002:circle
- !circle
center: &ORIGIN {x: 73, y: 129}
radius: 7
- !line
start: *ORIGIN
finish: { x: 89, y: 102 }
- !label
start: *ORIGIN
color: 0xFFEEBB
text: Pretty vector drawing.
#test.yaml(双叹号,强制转换类型)
str: !!str 3.14
int: !!int "" 输出:{'int': 123, 'str': '3.14'} #明显能够看出123被强转成了int类型,而float型的3.14则被强转成了str型
规范八:锚点与引用,定义数据的复用。
- 第一步:使用 “&” 定义数据锚点(即要复制的数据)
- 第二步:使用 “*” 引用上述锚点数据(即数据的复制目的地)
---
hr:
- Mark McGwire
# Following node labeled SS
- &SS Sammy Sosa # 定义要复制的数据
rbi:
- *SS # Subsequent occurrence 这里是数据复制目标
- Ken Griffey
原文1:https://blog.csdn.net/conquer0715/article/details/51283679
原文2:https://blog.csdn.net/lilun517735159/article/details/79230732
Yaml语法使用的更多相关文章
- YAML 语法
YAML 语法 来源:yaml 这个页面提供一个正确的 YAML 语法的基本概述, 它被用来描述一个 playbooks(我们的配置管理语言). 我们使用 YAML 是因为它像 XML 或 JSON ...
- saltstack实战3--配置管理之YAML语法
本文来自如下链接http://docs.saltstack.cn/topics/yaml/index.html 了解YAML 默认的SLS文件的renderer是YAML renderer.YAML是 ...
- ansible yaml 语法
yet another markup language -- 另外的一种标记语言 yaml 语法: 序列:同一个类型的数据有多个,用"-" 来区分,叫序列 映射:价值对,用&quo ...
- 【K8S】K8S-网络模型、POD/RC/SVC YAML 语法官方文档
K8S-网络模型.POD/RC/SVC YAML 语法官方文档 Kubernetes - Production-Grade Container Orchestration kubernetes/kub ...
- Ansible 小手册系列 八(Yaml 语法格式)
YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写.它实质上是一种通用的数据串行化格式. 它的基本语法规则如下. • 大小写敏感 • 使用缩进表示层级关系 • 缩进时不允许使用Ta ...
- ansible中yaml语法应用
4.yaml语法应用 ansible的playbook编写是yaml语言编写,掌握yaml语法是编写playbook的必要条件,格式要求和Python相似,具体教程参考如下 yaml语言教程 附上一个 ...
- YAML语法基础(K8s基础)
对于YAML语言,网上有很多将YAML转换为JSON格式的在线转换器,以下内容都可直接验证,另外若有兴趣更深入学习YAML,可到其官方站点去学习,下面介绍的仅仅是比较常用的内容,并非YAML语法的全部 ...
- ansible-playbook的YAML语法学习
YAML:可以将你打算对多机器的批量操作放到一个文件中,顺序执行,可以根据机器做到根据机器信息判断执行,其他命令执行结果判断执行. YAML有着严格的层级要求,稍微有个缩进问题就会无法运行,所以学习过 ...
- YAML语法使用,JSR303数据校验
YAML YAML是 "YAML Ain't a Markup Language" (YAML不是一种置标语言)的递归缩写 # yaml配置 server: prot: YAML语 ...
- SpringBoot-03-配置之yaml语法学习
3. SpringBoot配置 3.1 yaml语法学习 配置文件 Springboot使用一个全局的配置文件,配置文件名称固定 spplication.properties 语法结构:key=val ...
随机推荐
- angular当router使用userhash:false时路由404问题
angular当router使用userhash:false时路由404问题 安装iis urlrewrite2.0组件 在根目录下创建 Web.config <configuration> ...
- 2018-2019-2 网络对抗技术 20165321 Exp2 后门原理与实践
基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:网络钓鱼植入木马. (2)例举你知道的后门如何启动起来(win及linux)的方式? 答:绑定在合法软件上启动. (3)Met ...
- andorid开发build.gradle 增加几种产品的方法
因为需要有些ndk的开发,cmakelists里需要定义不同的变量,这个在网上搜索解决方案,不是很容易就直接找到答案. 尝试了不少,最后找到解决方案.升级Gradle3.0,这个文章价值高. 在ras ...
- Grid move
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- IT题库7-线程加锁
转载:http://www.cnblogs.com/linjiqin/p/3208843.html 一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏.例如:两个线程T ...
- 【转】数据处理常用的sql语句整理
一下语句都是基于 mysql数据库 查询是否使用索引 explain select * FROM t_table1; 结果列的含义: table:此次查询操作是关联哪张数据表 type:连接查询操作 ...
- Tengine 安装和说明
使用tengine要安装nginx.架构为:LTNMT或LTNMP 1. 官网下载源码包 [root@qc_centos7_5 src]# wget http://tengine.taobao.org ...
- px和em的区别, css权重
PX特点:px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. EM特点 1. em的值并不是固定的:2. em会继承父级元素的字体大小. 优先级:!important> ...
- 微信小程序组件通信
父子通信 在子组件的对应js中 properties:{ prop名字:数据类型, prop名字:{ type:数据类型, value:默认值 } } 在父组件的wxml模板中找到子组件标签 < ...
- nodejs基础快速上手
node 快速了解 hello node.js console.log("hello Node.js"); let http = require("http") ...