YAML是一種容易人類閱讀、適合表示程式語言的資料結構、可用於不同程式間交換資料、支援泛型工具、支援串列處理、豐富的表達能力和可擴充性、便於使用的語言。YAML利用縮排或者是explicit indicatior(如{})來表示屬性的嵌套,更為直觀和simple。
一、YAML的格式
YAML的格式及特點如下:
YAML使用可列印的Unicode字元,可使用UTF-8或UTF-16。
使用空白字元為檔案縮排來表示結構;不過不能使用跳格字元(TAB)。
註解由井字型大小( # )開始,可以出現在一行中的任何位置,而且範圍只有一行(也就是一般所謂的單行註解)
每個清單成員以單行表示,並用短杠+空白( - )起始。或使用方括弧( [ ] ),並用逗號+空白( , )分開成員。
每個雜湊表的成員用冒號+空白( : )分開索引值和內容。或使用大括弧( { } ),並用逗號+空白( , )分開。
雜湊表的索引值可以用問號 ( ? )起始,用來明確的表示多個詞彙組成的索引值。
字串平常並不使用引號,但必要的時候可以用雙引號 ( " )或單引號 ( ' )框住。
使用雙引號表示字串時,可用倒斜線( \ )開始的跳脫字元(這跟C語言類似)表示特殊字元。
區塊的字串用縮排和修飾詞(非必要)來和其他資料分隔,有新行保留(preserve)(使用符號 | )或新行摺疊(flod)(使用符號 > )兩種方式。
在單一檔案中,可用連續三個連字號(---)區分多個檔案。
另外,還有選擇性的連續三個點號( ... )用來表示檔案結尾。
重複的內容可使從參考標記星號 ( * )複製到錨點標記( & )。
指定格式可以使用兩個驚歎號 ( !! ),後面接上名稱。
檔案中的單一檔案可以使用指導指令,使用方法是百分比符號( % )。有兩個指導指令在YAML1.1版中被定義:
%YAML 指導指令,用來識別檔案的YAML版本。
%TAG 指導指令,被用在URI的字首標記。這個方法在標記節點的型態時相當有用。
YAML再使用逗號及冒號時,後面都必須接一個空白字元。
二、PyYAML的使用
1、安裝
python下安裝PyYAML模組可以使用YAML ,開啟https://pypi.python.org/pypi/PyYAML下載,目前的版本3.11 。pypi 網站上對該模組的描述如下:PyYAML features a complete YAML 1.1 parser, Unicode support, pickle support, capable extension API, and sensible error messages 。
可以連網的主機也可以通過pip install pyyaml 或easy_install pyymal 進行安裝。
2、yaml.load與yaml.dump方法
該模組提供了一些方法,不過常用的方法只有兩個yaml.load和yaml.dump ,以下是一個版本相關的yaml 格式檔案
[root@361way yaml]# cat tree.yamltreeroot: branch1: name: Node 1 branch1-1: name: Node 1-1 branch2: name: Node 2 branch2-1: name: Node 2-1
yaml.load方法:
# 指令碼內容[root@361way yaml]# cat load.pyimport yamlf = open('tree.yaml')dataMap = yaml.load(f)f.close()print dataMap# 執行結果如下[root@361way yaml]# python load.py{'treeroot': {'branch2': {'branch2-1': {'name': 'Node 2-1'}, 'name': 'Node 2'}, 'branch1': {'branch1-1': {'name': 'Node 1-1'}, 'name': 'Node 1'}}}
yuml.dump方法:
這裡還承接上面的指令碼,調用裡面的dataMap 資料,將其儲存一直新的yaml 檔案,如下:
# 代碼如下:f = open('newtree.yaml', "w")yaml.dump(dataMap, f)f.close()#newtree.yaml 的結果如下[root@361way yaml]# cat newtree.yamltreeroot: branch1: branch1-1: {name: Node 1-1} name: Node 1 branch2: branch2-1: {name: Node 2-1} name: Node 2
除此之外,還有safe_load、safe_dump、 load_all 等主法,具體可以通過pydoc yaml 進行查看。
三、yaml、xml與json
1、yaml 與xml
以下是同一內容,分別使用xml 語言標記與 yaml 語言標記:
# xml標記兩個site<site> <name>sina</name> <url>http://www.111cn.net </url></site><site> <name>google</name> <url>http://www.91it.org</url></site># 使用yaml標記兩個site---site: name: sina url : http://www.111cn.net ---site: name: google url : http://www.91it.org# 使用yaml標記兩個site---site: {name: sina, url: http://www.111cn.net }---site: {name: google, url: http://www.111cn.net}
從讀取查看的角度來看,有沒有發現yaml 相對xml 語言的優勢。
2、yaml 與 json
準確的說json 應該算是yaml 標準下的一個字集,通過python語句可以很方面的在兩者之間進行轉換。
a、轉換YAML到JSON
# python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' < file.yaml > file.json或#!/usr/bin/env pythonimport yaml,jsonyml = """--- foo: bar"""data = yaml.load(yml)json = json.dumps(data)print(json)
b、轉換JSON到YAML
# python -c 'import sys, yaml, json; yaml.dump(json.load(sys.stdin), sys.stdout, default_flow_style=False)' < file.json > file.yaml或#!/usr/bin/env pythonimport json,yamlstr = '{ "foo": "bar" }'data = json.loads(str)yml = yaml.safe_dump(data)print(yml)
註:很多情況下,甚至可以直接將json尾碼的檔案改為yaml 尾碼,使用yaml 語言直接解析。
四、yaml 在python語言中的應用
yaml 語言在很多優秀的python 程式中都有使用,比如營運工程師經常使用的兩個自動化工作saltstack 與 Ansible 。更多PyYAML 模組的用法,也可以查看其官方wiki 頁