YAML简介
YAML是一個可讀性高,用來表達數據序列的格式。YAML參考了其它多種語言,包括:C語言、Python、Perl,并從XML、電子郵件的數據格式中獲得靈感。Clark Evans在2001年首次發表了這種語言。當前已經有數種編程語言或腳本語言支持這種語言。最新穩定版本為1.2,于2009年發布。YAML文件擴展名為.yaml或.yml。
YAML是”YAML Ain’t a Markup Language”(YAML不是一種標記語言)的遞歸縮寫。在開發這種語言時,YAML的意思其實是:”Yet Another Markup Language”(仍是一種標記語言),但為了強調這種語言以數據做為中心,而不是以標記語言為重點,而用反向縮略語重命名。
YAML功能:YAML的語法和其他高級語言類似,并且可以簡單表達清單、散列表,標量等數據形態。它使用空白符號縮進和大量依賴外觀的特色,特別適合用來表達或編輯數據結構、各種配置文件、傾印調試內容、文件大綱(例如:許多電子郵件標題格式和YAML非常接近)。盡管它比較適合用來表達層次結構式(hierarchical model)的數據結構,不過也有精致的語法可以表示關系性(relational model)的數據。由于YAML使用空白字符和分行來分隔數據,使得它特別適合用grep/Python/Perl/Ruby操作。其讓人最容易上手的特色是巧妙避開各種封閉符號,如:引號、各種括號等,這些符號在嵌套結構時會變得復雜而難以辨認。
在YAML中,字符串不一定要用雙引號標示。另外,在縮進中空白字符的數目并不是非常重要,只要相同層次結構的元素左側對齊就可以了(不過不能使用TAB字符)。文件中重復的部分用這個方法處理:使用錨點(&)和引用(*)標簽。也可以在文件中加入選擇性的空行,以增加可讀性。在一個文件中,可同時包含多個文件,并用"---"分隔。選擇性的符號"..."可以用來表示文件結尾。
YAML構成要素:
YAML基本組件:YAML提供縮進/區塊以及內置(inline)兩種格式,來表示清單和散列表:
(1). 清單:習慣上清單比較常用區塊格式(block format)表示,也就是用短杠+空白字符作為起始;另外還有一種內置格式(inline format),可以選擇用方括號圍住,并用逗號+空白區隔(類似JSON的語法);
(2). 散列表:鍵值和數據由冒號及空白字符分開。區塊形式(常使用與YAML數據文檔中)使用縮進和換行符分隔key: value對。內置形式(常使用與YAML數據流中)在大括號中使用逗號+空白字符分隔key: value對。
區塊的字符:再次強調,字符串不需要包在引號之內。有兩種方法書寫多行文字(multi-line strings),一種可以保存新行(使用”|”字符),另一種可以折疊新行(使用”>”字符)。
保存新行(newlines preserved):根據設置,前方的引領空白符號(leading white space)必須排成條狀,以便和其它數據或是行為明顯區分。
折疊新行(newlines folded):和保存新行不同的是,換行字符會被轉換成空白字符,而引領空白字符則會被自動消去。
YAML高級組件:
數據合并和參考:為了維持文件的簡潔,并避免數據輸入的錯誤,YAML提供了結點參考(*)和散列合并(<<)參考到其他結點標簽的錨點標記(&)。參考會將樹狀結構加入錨點標記的內容,并可以在所有數據結構中運作合并只有散列表可以使用,可以將鍵值自錨點標記復制到指定的散列表中。
YAML自動判定數據形態是哪一種實體。但有時用戶會想要將數據強制轉型成自定的某種類型。最常見的狀況是字符串,有時候可能看起來像數字或布爾值,這種時候可以使用雙引號,或是使用嚴格類型標簽。
除了一般的數據形態之外,用戶也可以使用一些較為高級的類型,但不保證可被每種解析器分析。使用時和強制轉型類似,要在形態名稱之前加上兩個驚嘆號(!!)。
YAML語法:
(1). YAML使用可打印的Unicode字符,可使用UTF-8或UTF-16;
(2). 使用空白字符為文件縮進來表示結構;不過不能使用跳格字符(TAB);
(3). 注解由井字號(#)開始,可以出現在一行中的任何位置,而且范圍只有一行(也就是一般所謂的單行注解);
(4). 每個清單成員以單行表示,并用短杠+空白起始?;蚴褂梅嚼ㄌ?#xff0c;并用逗號+空白分開成員;
(5). 每個散列表的成員用冒號+空白分開鍵值和內容。或使用大括號,并用逗號+空白分開;散列表的鍵值可以用問號起始,用來明確的表示多個詞匯組成的鍵值;
(6). 字符串平常并不使用引號,但必要的時候可以用雙引號或單引號框住;使用雙引號表示字符串時,可用倒斜線(\)開始的轉義字符(這跟C語言類似)表示特殊字符;
(7). 區塊的字符串用縮進和修飾符(非必要)來和其他數據分隔,有新行保留(preserve)(使用符號”|”)或新行折疊(fold)(使用符號”>”)兩種方式;
(8). 在單一文件中,可用連續三個連字號(---)區分多個文件或表示文件的開始;另外,還有選擇性的連續三個點號(...)用來表示文件結尾;
(9). 重復的內容可使從參考標記星號(*)復制到錨點標記(&);
(10). 指定格式(即類型強行轉換)可以使用兩個驚嘆號(!!),后面接上名稱。
YAML在使用逗號及冒號時,后面都必須接一個空白字符,所以可以在字符串或數值中自由加入分隔符號而不需要使用引號。另外還有兩個特殊符號在YAML中被保留,有可能在未來的版本被使用(@)和(`)。
YAML的數據形態不依賴引號之特點,使的YAML文件可以利用區塊,輕易的插入各種其他類型文件,如:XML、SDL、JSON,甚至插入另一篇YAML。
以上內容主要摘自中文維基百科:https://zh.wikipedia.org/wiki/YAML?
在Python中可以通過pyyaml來解析或生成yaml文件,以下是yaml測試文件(config.yml):
# config file:
---blog:name: csdnid: fengbingchunurl: https://blog.csdn.net/fengbingchuncommands:version:- g++ --version- cmake --version- git --versionvalue1: true
value2: false
value3: ~number1: 123
number2: !!str 123
number3: "123"
number4: !!float 123github: - https://github.com/fengbingchun- Repositories NN_Test Face_TestMessy_Test CUDA_Testdata1: |There oncewas ashort mandata2: >There oncewas ashort mandate1: 2019-03-03step: &id001 # defines anchor label &id001instrument: Lasik 2000pulseEnergy: 5.4step2: *id001 # refers to the first step (with anchor &id001)...
python測試代碼如下:
import sys
import yamldef main():print("#### test start ####")f = open("config.yml")content = yaml.load(f)print(content)print("#### test end ####")if __name__ == "__main__":main()
執行結果如下:
?
GitHub:https://github.com/fengbingchun/Messy_Test
總結
- 上一篇: 图像集存储成MNIST数据集格式实现
- 下一篇: 经典网络LeNet-5介绍及代码测试(C