YAML简介

YAML是一个可读性高,用来表达数据序列的格式。YAML参考了其它多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式中获得灵感。Clark Evans在2001年首次发表了这种语言。当前已经有数种编程语言或脚本语言支持这种语言。最新稳定版本为1.2,于2009年发布。YAML文件扩展名为.yaml或.yml。

YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发这种语言时,YAML的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

YAML功能:YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。尽管它比较适合用来表达层次结构式(hierarchical model)的数据结构,不过也有精致的语法可以表示关系性(relational model)的数据。由于YAML使用空白字符和分行来分隔数据,使得它特别适合用grep/Python/Perl/Ruby操作。其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构时会变得复杂而难以辨认。

在YAML中,字符串不一定要用双引号标示。另外,在缩进中空白字符的数目并不是非常重要,只要相同层次结构的元素左侧对齐就可以了(不过不能使用TAB字符)。文件中重复的部分用这个方法处理:使用锚点(&)和引用(*)标签。也可以在文件中加入选择性的空行,以增加可读性。在一个文件中,可同时包含多个文件,并用"---"分隔。选择性的符号"..."可以用来表示文件结尾。

YAML构成要素

YAML基本组件:YAML提供缩进/区块以及内置(inline)两种格式,来表示清单和散列表:

(1). 清单:习惯上清单比较常用区块格式(block format)表示,也就是用短杠+空白字符作为起始;另外还有一种内置格式(inline format),可以选择用方括号围住,并用逗号+空白区隔(类似JSON的语法);

(2). 散列表:键值和数据由冒号及空白字符分开。区块形式(常使用与YAML数据文档中)使用缩进和换行符分隔key: value对。内置形式(常使用与YAML数据流中)在大括号中使用逗号+空白字符分隔key: value对。

区块的字符:再次强调,字符串不需要包在引号之内。有两种方法书写多行文字(multi-line strings),一种可以保存新行(使用”|”字符),另一种可以折叠新行(使用”>”字符)。

保存新行(newlines preserved):根据设置,前方的引领空白符号(leading white space)必须排成条状,以便和其它数据或是行为明显区分

折叠新行(newlines folded):和保存新行不同的是,换行字符会被转换成空白字符,而引领空白字符则会被自动消去。

YAML高级组件

数据合并和参考:为了维持文件的简洁,并避免数据输入的错误,YAML提供了结点参考(*)和散列合并(<<)参考到其他结点标签的锚点标记(&)。参考会将树状结构加入锚点标记的内容,并可以在所有数据结构中运作合并只有散列表可以使用,可以将键值自锚点标记复制到指定的散列表中。

YAML自动判定数据形态是哪一种实体。但有时用户会想要将数据强制转型成自定的某种类型。最常见的状况是字符串,有时候可能看起来像数字或布尔值,这种时候可以使用双引号,或是使用严格类型标签。

除了一般的数据形态之外,用户也可以使用一些较为高级的类型,但不保证可被每种解析器分析。使用时和强制转型类似,要在形态名称之前加上两个惊叹号(!!)。

YAML语法

(1). YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16;

(2). 使用空白字符为文件缩进来表示结构;不过不能使用跳格字符(TAB)

(3). 注解由井字号(#)开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解);

(4). 每个清单成员以单行表示,并用短杠+空白起始。或使用方括号,并用逗号+空白分开成员;

(5). 每个散列表的成员用冒号+空白分开键值和内容。或使用大括号,并用逗号+空白分开;散列表的键值可以用问号起始,用来明确的表示多个词汇组成的键值

(6). 字符串平常并不使用引号,但必要的时候可以用双引号或单引号框住使用双引号表示字符串时,可用倒斜线(\)开始的转义字符(这跟C语言类似)表示特殊字符

(7). 区块的字符串用缩进和修饰符(非必要)来和其他数据分隔,有新行保留(preserve)(使用符号”|”)或新行折叠(fold)(使用符号”>”)两种方式;

(8). 在单一文件中,可用连续三个连字号(---)区分多个文件或表示文件的开始另外,还有选择性的连续三个点号(...)用来表示文件结尾

(9). 重复的内容可使从参考标记星号(*)复制到锚点标记(&)

(10). 指定格式(即类型强行转换)可以使用两个惊叹号(!!),后面接上名称。

YAML在使用逗号及冒号时,后面都必须接一个空白字符,所以可以在字符串或数值中自由加入分隔符号而不需要使用引号。另外还有两个特殊符号在YAML中被保留,有可能在未来的版本被使用(@)和(`)。

YAML的数据形态不依赖引号之特点,使的YAML文件可以利用区块,轻易的插入各种其他类型文件,如:XML、SDL、JSON,甚至插入另一篇YAML。

以上内容主要摘自中文维基百科:https://zh.wikipedia.org/wiki/YAML 

在Python中可以通过pyyaml来解析或生成yaml文件,以下是yaml测试文件(config.yml):

# config file:
---

blog:
  name: csdn
  id: fengbingchun
  url: https://blog.youkuaiyun.com/fengbingchun

commands:
  version:
  - g++ --version
  - cmake --version
  - git --version

value1: true
value2: false
value3: ~

number1: 123
number2: !!str 123
number3: "123"
number4: !!float 123

github: 
  - https://github.com/fengbingchun
  - Repositories NN_Test Face_Test
    Messy_Test CUDA_Test

data1: |
  There once
  was a
     short man

data2: >
  There once
  was a
     short man

date1: 2019-03-03

step: &id001   # defines anchor label &id001
  instrument:  Lasik 2000
  pulseEnergy: 5.4

step2: *id001   # refers to the first step (with anchor &id001)

...

python测试代码如下:

import sys
import yaml

def main():
	print("#### test start ####")
	f = open("config.yml")
	content = yaml.load(f)
	print(content)
	print("#### test end ####")

if __name__ == "__main__":
	main()

执行结果如下:

 

GitHubhttps://github.com/fengbingchun/Messy_Test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值