yaml在python上的使用教程詳解

來源:互聯網
上載者:User


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 頁

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.