第3天:YAML语法

YAML是一种可读性很强的数据格式语言。正是因为YAML良好的可读性,其普遍引用于软件配置中。python

语法规则

  • YAML文件中的第一行为"---",表示这是一个YAML文件;
  • YAML中的字段大小写敏感
  • YAML与Python同样,使用缩进表示层级关系
  • YAML的缩进不容许使用Tab键,只容许使用空格,且空格的数目不重要,只要相同层级的元素左侧对齐便可
  • "#"表示注释,从这个字符一直到行尾都会被解析器忽略

YAML支持三种格式的数据,分别是:数组

  • 对象:键值对的集合,又称为映射,相似于Python中的字典
  • 数组:一组按次序排列的值,有称为序列,相似于Python中的列表
  • 纯量:单个的,不可 再分的值,如字符串、布尔值与数字

YAML例子演示

下面结合Python来看几个YAML的例子,这些自理没有包含YAML的所有语法,可是足够理解和编写Ansible的Playbook.ruby

为了解析YAML格式的文件,须要安装第三方的PyYAML库。直接使用pip安装便可:oop

pip install PyYAML

在YAML中的数组,只须要用"-"将元素按序列出便可, 好比有一个data.yaml文件,内容以下this

---
#一个美味水果的列表
- Apple
- Orange
- Strawberry
- Mango

使用PyYAML库解析YAML文件很是简单,以下spa

In [1]: import yaml

In [2]: with open('data.yaml') as f:
   ...:     print(yaml.load(f))
   ...:     
['Apple', 'Orange', 'Strawberry', 'Mango']

在YAML中,对象以"key:value"的形式进行定义,以下code

---
#觉得职工的记录
name: Example Developer
job: Developer
skill: Elite

转换为python内部对象之后,结果以下:对象

{'skill': 'Elite', 'job': 'Developer', 'name': 'Example Developer'}

YAML中可使用多种方式指定布尔值,例以下面的格式都是合法的blog

---
create_key: yes
needs_agent: no
knows_oopL: True
like_emacs: TRUE
uses_cvs: false

转换为python代码之后,对变量的取值进行了格式化ip

{'create_key': True, 'like_emacs': True, 'needs_agent': False, 'knows_oopL': True, 'uses_cvs': False}

YAML中的对象和数组也能够任意嵌套

---
#一位职工记录
name: heboan
job: sa
skill: Elite
employed: True
foods:
    - Apple
    - Orange
    - Strawberry
    - Mango
languages:
    ruby: Elite
    python: Elite
    dotnet: Lame

将上面的YAML转换为Python的内部对象结果以下

{
    'languages': {
        'python': 'Elite', 
        'dotnet': 'Lame', 
        'ruby': 'Elite'
        }, 
    'foods': [
        'Apple', 
        'Orange', 
        'Strawberry', 
        'Mango'
    ], 
    'name': 'heboan',
    'employed': True, 
    'skill': 'Elite',
    'job': 'sa'
}

在YAML中定义字符串时,甚至都不须要使用单引号或双引号,直接写在文件建中便可:

str: this is a string

若是字符串中包含特殊字符,须要使用双引号包含起来,如冒号

str: "somebody said I should put a colon here: so I did"

若是字符串的内容较长,可使用">"来折叠换行,也就是说,接下来的缩进的内容都是这个字符串的一部分:

---
str: >
    my name is heboan
    cccc

转换成python以下:

{'str': 'my name is heboan cccc\n'}
相关文章
相关标签/搜索