首页 >邮件操作 > 内容

YAML简介

2023年10月3日 21:27

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.csdn.net/fengbingchuncommands:  version:  - g++ --version  - cmake --version  - git --versionvalue1: truevalue2: falsevalue3: ~number1: 123number2: !!str 123number3: "123"number4: !!float 123github:   - https://github.com/fengbingchun  - Repositories NN_Test Face_Test    Messy_Test CUDA_Testdata1: |  There once  was a     short mandata2: >  There once  was a     short mandate1: 2019-03-03step: &id001   # defines anchor label &id001  instrument:  Lasik 2000  pulseEnergy: 5.4step2: *id001   # refers to the first step (with anchor &id001)...

python测试代码如下:

import sysimport yamldef 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


参考文章:https://blog.csdn.net/fengbingchun/article/details/88090609

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时候联系我们修改或删除,在此表示感谢。

特别提醒:

1、请用户自行保存原始数据,为确保安全网站使用完即被永久销毁,如何人将无法再次获取。

2、如果上次文件较大或者涉及到复杂运算的数据,可能需要一定的时间,请耐心等待一会。

3、请按照用户协议文明上网,如果发现用户存在恶意行为,包括但不限于发布不合适言论妄图

     获取用户隐私信息等行为,网站将根据掌握的情况对用户进行限制部分行为、永久封号等处罚。

4、如果文件下载失败可能是弹出窗口被浏览器拦截,点击允许弹出即可,一般在网址栏位置设置

5、欢迎将网站推荐给其他人,网站持续更新更多功能敬请期待,收藏网站高效办公不迷路。

      



登录后回复

共有0条评论