第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'}
相關文章
相關標籤/搜索