yaml在python上的使用估計(jì)很多的朋友不知道吧,下面小編來(lái)為各位介紹一篇yaml在python上的使用教程,希望文章對(duì)各位有用.
YAML是一種容易人類閱讀、適合表示程序語(yǔ)言的數(shù)據(jù)結(jié)構(gòu)、可用于不同程序間交換數(shù)據(jù)、支持泛型工具、支持串行處理、豐富的表達(dá)能力和可擴(kuò)展性、易于使用的語(yǔ)言,YAML利用縮進(jìn)或者是explicit indicatior(如{})來(lái)表示屬性的嵌套,更為直觀和simple.
一、YAML的格式
YAML的格式及特點(diǎn)如下:YAML使用可打印的Unicode字元,可使用UTF-8或UTF-16,使用空白字元為文件縮排來(lái)表示結(jié)構(gòu),不過(guò)不能使用跳格字元(TAB).
注解由井字號(hào)( # )開(kāi)始,可以出現(xiàn)在一行中的任何位置,而且范圍只有一行,也就是一般所謂的單行注解,每個(gè)清單成員以單行表示,并用短杠+空白( - )起始,或使用方括號(hào)( [ ] ),并用逗號(hào)+空白( , )分開(kāi)成員。
每個(gè)雜湊表的成員用冒號(hào)+空白( : )分開(kāi)鍵值和內(nèi)容。或使用大括號(hào)( { } ),并用逗號(hào)+空白( , )分開(kāi)。
雜湊表的鍵值可以用問(wèn)號(hào) ( ? )起始,用來(lái)明確的表示多個(gè)詞匯組成的鍵值,字串平常并不使用引號(hào),但必要的時(shí)候可以用雙引號(hào) ( " )或單引號(hào) ( ' )框住。
使用雙引號(hào)表示字串時(shí),可用倒斜線( / )開(kāi)始的跳脫字元(這跟C語(yǔ)言類似)表示特殊字元,區(qū)塊的字串用縮排和修飾詞(非必要)來(lái)和其他資料分隔,有新行保留(preserve)(使用符號(hào) | )或新行折疊(flod)(使用符號(hào) > )兩種方式。
在單一檔案中,可用連續(xù)三個(gè)連字號(hào)(---)區(qū)分多個(gè)檔案,另外,還有選擇性的連續(xù)三個(gè)點(diǎn)號(hào)( ... )用來(lái)表示檔案結(jié)尾,重復(fù)的內(nèi)容可使從參考標(biāo)記星號(hào) ( * )復(fù)制到錨點(diǎn)標(biāo)記( & ),指定格式可以使用兩個(gè)驚嘆號(hào) ( !! ),后面接上名稱。
檔案中的單一文件可以使用指導(dǎo)指令,使用方法是百分比符號(hào)( % ),有兩個(gè)指導(dǎo)指令在YAML1.1版中被定義:
%YAML 指導(dǎo)指令,用來(lái)識(shí)別文件的YAML版本.
%TAG 指導(dǎo)指令,被用在URI的字首標(biāo)記,這個(gè)方法在標(biāo)記節(jié)點(diǎn)的型態(tài)時(shí)相當(dāng)有用.
YAML再使用逗號(hào)及冒號(hào)時(shí),后面都必須接一個(gè)空白字元.
二、PyYAML的使用
1、安裝
python下安裝PyYAML模塊可以使用YAML ,打開(kāi)https://pypi.python.org/pypi/PyYAML下載,當(dāng)前版本3.11 。pypi 站點(diǎn)上對(duì)該模塊的描述如下:PyYAML features a complete YAML 1.1 parser, Unicode support, pickle support, capable extension API, and sensible error messages 。
可以連網(wǎng)的主機(jī)也可以通過(guò)pip install pyyaml 或easy_install pyymal 進(jìn)行安裝。
2、yaml.load與yaml.dump方法
該模塊提供了一些方法,不過(guò)常用的方法只有兩個(gè)yaml.load和yaml.dump,以下是一個(gè)版本相關(guān)的yaml 格式文件.
- [root@361way yaml]# cat tree.yaml
- treeroot:
- branch1:
- name: Node 1
- branch1-1:
- name: Node 1-1
- branch2:
- name: Node 2
- branch2-1:
- name: Node 2-1
yaml.load方法:
- # 腳本內(nèi)容
- [root@361way yaml]# cat load.py
- import yaml
- f = open('tree.yaml')
- dataMap = yaml.load(f)
- f.close()
- print dataMap
- # 執(zhí)行結(jié)果如下
- [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方法:
這里還承接上面的腳本,調(diào)用里面的dataMap 數(shù)據(jù),將其保存一直新的yaml 文件,如下:
- # 代碼如下:
- f = open('newtree.yaml', "w")
- yaml.dump(dataMap, f)
- f.close()
- #newtree.yaml 的結(jié)果如下
- [root@361way yaml]# cat newtree.yaml
- treeroot:
- 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 等主法,具體可以通過(guò)pydoc yaml 進(jìn)行查看.
三、yaml、xml與json
1、yaml 與xml
以下是同一內(nèi)容,分別使用xml 語(yǔ)言標(biāo)記與 yaml 語(yǔ)言標(biāo)記:
- # xml標(biāo)記兩個(gè)site
- <site>
- <name>sina</name>
- <url>http://m.survivalescaperooms.com </url>
- </site>
- <site>
- <name>google</name>
- <url>http://m.survivalescaperooms.com</url>
- </site>
- # 使用yaml標(biāo)記兩個(gè)site
- ---
- site:
- name: sina
- url : http://m.survivalescaperooms.com
- ---
- site:
- name: google
- url : http://m.survivalescaperooms.com
- # 使用yaml標(biāo)記兩個(gè)site
- ---
- site: {name: sina, url: http://www.111cn.net }
- ---
- site: {name: google, url: http://www.111cn.net}
從讀取查看的角度來(lái)看,有沒(méi)有發(fā)現(xiàn)yaml 相對(duì)xml 語(yǔ)言的優(yōu)勢(shì).
2、yaml 與 json
準(zhǔn)確的說(shuō)json 應(yīng)該算是yaml 標(biāo)準(zhǔn)下的一個(gè)字集,通過(guò)python語(yǔ)句可以很方面的在兩者之間進(jìn)行轉(zhuǎn)換.
a、轉(zhuǎn)換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 python
- import yaml,json
- yml = """
- ---
- foo: bar
- """
- data = yaml.load(yml)
- json = json.dumps(data)
- print(json)
b、轉(zhuǎn)換JSON到Y(jié)AML
- # 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 python
- import json,yaml
- str = '{ "foo": "bar" }'
- data = json.loads(str)
- yml = yaml.safe_dump(data)
- print(yml)
注:很多情況下,甚至可以直接將json后綴的文件改為yaml 后綴,使用yaml 語(yǔ)言直接解析.
四、yaml 在python語(yǔ)言中的應(yīng)用
yaml 語(yǔ)言在很多優(yōu)秀的python 程序中都有使用,比如運(yùn)維工程師經(jīng)常使用的兩個(gè)自動(dòng)化工作saltstack 與 Ansible,更多PyYAML 模塊的用法,也可以查看其官方wiki 頁(yè).
新聞熱點(diǎn)
疑難解答
圖片精選