yaml文件處理(http://pyyaml.org/wiki/PyYAMLDocumentation) 摘要: 本文講的是yaml在python上的使用教程詳解, YAML是一種容易人類閱讀、適合表示程式語言的數據結構、可用於不同程式間交換數據、支持泛型工具、支持串列處理、豐富的表達能力和可擴展性 ...
yaml文件處理(http://pyyaml.org/wiki/PyYAMLDocumentation)
摘要: 本文講的是yaml在python上的使用教程詳解, YAML是一種容易人類閱讀、適合表示程式語言的數據結構、可用於不同程式間交換數據、支持泛型工具、支持串列處理、豐富的表達能力和可擴展性、易於使用的語言。YAML利用縮進或者是explicit indicatior(如{})來表示屬。
YAML是一種容易人類閱讀、適合表示程式語言的數據結構、可用於不同程式間交換數據、支持泛型工具、支持串列處理、豐富的表達能力和可擴展性、易於使用的語言。YAML利用縮進或者是explicit indicatior(如{})來表示屬性的嵌套,更為直觀和simple。
YAML用來做配置文件,很多項目的配置文件都是yaml文件格式。
一、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格式文件:
yaml文件:
treeroot: branch1: name: Node 1 branch1-1: name: Node 1-1 branch2: name: Node 2 branch2-1: name: Node 2-1 程式處理: import yaml with open("yaml文件","r") as f: message = yaml.load(f) print(type(message),message) 運行結果如下: <class 'dict'> {'treeroot': {'branch1': {'name': 'Node 1', 'branch1-1': {'name': 'Node 1-1'}}, 'branch2': {'name': 'Node 2', 'branch2-1': {'name': 'Node 2-1'}}}}
yuml.dump方法:
這裡還承接上面的腳本,調用裡面的dataMap 數據,將其保存一直新的yaml 文件,如下:
import yaml
with open("yaml文件","r") as f:
message = yaml.load(f)
f1 = open("new_yaml.yaml","w")
yaml.dump(message,f1)
f1.close()
new_yaml.yaml的結果如下:
treeroot:
branch1:
branch1-1: {name: Node 1-1}
name: Node 1
branch2:
branch2-1: {name: Node 2-1}
name: Node 2
三、yaml 在python語言中的應用
yaml 語言在很多優秀的python 程式中都有使用,比如運維工程師經常使用的兩個自動化工作saltstack 與 Ansible 。更多PyYAML 模塊的用法,也可以查看其官方wiki頁
YAML的適用範圍
由於實現簡單,解析成本很低,YAML特別適合在腳本語言中使用.列一下現有的語言現現:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是腳本語言.YAML比較適合做序列化。因為它是宿主語言數據類型直轉的。
YAML做配置文件也不錯。比如Ruby on Rails的配置就選用的YAML。對ROR而言,這很自然,也很省事.由於相容性問題,不同語言間的數據流轉建議現在不要用YAML.
YAML文件及處理:
yaml文件: name: Tom Smith age: 37 spouse: name: Jane Smith age: 25 children: - name: Jimmy Smith age: 15 - name1: Jenny Smith age1: 12 - work: dataanalysis date: 2017-5-18 #yaml處理腳本 import yaml f = open("new_yaml.yaml","r") message = yaml.load(f) f.close() print(message) 運行結果如下: {'name': 'Tom Smith', 'spouse': {'name': 'Jane Smith', 'age': 25}, 'age': 37, 'children': [{'name': 'Jimmy Smith', 'age': 15}, {'age1': 12, 'name1': 'Jenny Smith'}, {'date': '2017-5-18', 'work': 'dataanalysis'}]}
從上面可以看出,"-"代表統計,生成的時候會是一個列表的形式,這樣可用於字典下麵嵌套列表,文件前面有幾個"-"代表嵌套了幾層字典。