YAML 學(xué)習(xí)

YAML 官方文檔:https://yaml.org/

參考:Python YAML tutorial

1 簡介

YAML("YAML Ain't a Markup Language",YAML 不是標記語言)是一種數(shù)據(jù)序列化語言厨埋,旨在對人類友好邪媳,并且可以與現(xiàn)代編程語言很好地配合日常日常工作。

開放荡陷,可互操作且易于理解的工具極大地提高了計算能力雨效。YAML 從一開始就被設(shè)計為對使用數(shù)據(jù)的人員有用且友好。 它使用 Unicode 可打印字符废赞,其中一些字符提供結(jié)構(gòu)信息徽龟,其余字符包含數(shù)據(jù)本身。YAML 通過最大程度地減少結(jié)構(gòu)特征的數(shù)量并允許數(shù)據(jù)以自然而有意義的方式展示自身唉地,從而實現(xiàn)了獨特的清潔度据悔。例如,縮進可以用于結(jié)構(gòu)耘沼,冒號用于分隔key: value 對和 - 用于創(chuàng)建“項目符號”列表极颓。

數(shù)據(jù)結(jié)構(gòu)有無數(shù)種形式,但是它們都可以用三個基本結(jié)構(gòu)表示:映射(哈希/字典)群嗤,序列(數(shù)組/列表)和標量(字符串/數(shù)字)菠隆。YAML 利用了這些基本結(jié)構(gòu),并添加了簡單的 typing 系統(tǒng)和別名機制來形成用于序列化任何 native 數(shù)據(jù)結(jié)構(gòu)的完整語言。盡管大多數(shù)編程語言都可以使用 YAML 進行數(shù)據(jù)序列化骇径,但是 YAML 擅長使用那些基本上圍繞三個基本原語構(gòu)建的語言躯肌。這些包括新的敏捷語言,例如 Perl既峡,Python羡榴,PHP,Ruby 和 Javascript运敢。

YAML 還是專門為在常見的用例(如配置文件校仑,日志文件,進程間消息傳遞传惠,跨語言數(shù)據(jù)共享迄沫,對象持久性以及復(fù)雜數(shù)據(jù)結(jié)構(gòu)的調(diào)試)提供支持。當(dāng)數(shù)據(jù)易于查看和理解時卦方,編程將變得更加簡單羊瘩。

1.1 目標

YAML 的設(shè)計目標是降低復(fù)雜性:

  1. YAML 易于人類閱讀。
  2. YAML 數(shù)據(jù)可在編程語言之間移植盼砍。
  3. YAML 與敏捷語言的本機數(shù)據(jù)結(jié)構(gòu)匹配尘吗。
  4. YAML 具有一致的模型來支持通用工具。
  5. YAML 支持 one-pass 處理浇坐。
  6. YAML 具有表現(xiàn)力和可擴展性睬捶。
  7. YAML 易于實現(xiàn)和使用。

1.2 語言特性

YAML 基于縮進的作用域與 Python 相似(沒有制表符引起的歧義)近刘∏苊常縮進的塊便于檢查數(shù)據(jù)結(jié)構(gòu)。YAML 的文字風(fēng)格利用了這一點觉渴,可以使格式化的文本在縮進的結(jié)構(gòu)中干凈地混合在一起介劫,而不會產(chǎn)生麻煩的轉(zhuǎn)義。YAML 還允許使用類似于 JSON 和 Perl 的基于指標的傳統(tǒng)范圍案淋。這樣的流內(nèi)容可以自由地嵌套在縮進的塊中座韵。

YAML 的雙引號樣式使用了熟悉的 C 樣式轉(zhuǎn)義序列。這將啟用不可打印或 8 位(ISO 8859-1)字符(例如"\x3B")的 ASCII 編碼踢京。 轉(zhuǎn)義序列(例如 “\u003B” 和 “\U0000003B”)支持不可打印的 16 位 Unicode 和 32 位(ISO / IEC 10646)字符回右。

受 HTML 的行尾規(guī)范化影響,YAML 的行折疊采用了一種直觀的方法來處理換行符漱挚。單個換行符被折疊到一個空格中,而空行則被解釋為換行符渺氧。此技術(shù)允許對段落進行單詞包裝旨涝,而不會影響標量內(nèi)容的規(guī)范形式。

YAML 的核心類型系統(tǒng)基于 Perl,Python 和 Ruby 等敏捷語言的要求白华。YAML 直接支持集合(映射慨默,序列)和標量。對這些通用類型的支持使程序員可以將其語言的本機數(shù)據(jù)結(jié)構(gòu)用于 YAML 操作弧腥,而不需要特殊的文檔對象模型(DOM)厦取。

與 XML 的 SOAP 一樣,YAML 支持通過別名機制對 native 數(shù)據(jù)結(jié)構(gòu)圖進行序列化管搪。與 SOAP 一樣虾攻,YAML 也提供了應(yīng)用程序定義的類型。這使 YAML 可以代表現(xiàn)代分布式計算所需的豐富數(shù)據(jù)結(jié)構(gòu)更鲁。YAML 使用受 Java 的基于 DNS 的軟件包命名約定和 XML 的基于 URI 的命名空間啟發(fā)的命名空間機制來提供全局唯一類型名稱霎箍。另外,YAML允許特定于單個應(yīng)用程序的私有類型澡为。

YAML旨在支持增量接口漂坏,該接口包括輸入(getNextEvent)和輸出(sendNextEvent)one-pass 接口。 這些特性共同使 YAML 支持大型文檔(例如交易日志)或連續(xù)流(例如來自生產(chǎn)機器的提要)的處理媒至。

1.3 PyYaml

官方推薦的 YAML 文件擴展名是 .yaml 或者 .yml顶别。 Python 中有兩個用于 YAML 的模塊:PyYAML 和 ruamel.yaml。在本教程中拒啰,我們使用前者驯绎。

YAML 支持三種基本數(shù)據(jù)類型:標量(例如字符串,整數(shù)和浮點數(shù))图呢,列表和關(guān)聯(lián)數(shù)組条篷。

安裝:

pip install pyyaml

2 基本語法

  1. 大小寫敏感
  2. 使用縮進表示層級關(guān)系
  3. 縮進不允許使用 tab,只允許空格
  4. 縮進的空格數(shù)不重要蛤织,只要相同層級的元素左對齊即可
  5. # 表示注釋

2.1 數(shù)據(jù)類型

YAML 支持以下幾種數(shù)據(jù)類型:

  1. 對象:鍵值對的集合赴叹,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  2. 數(shù)組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
  3. 標量(scalars):單個的指蚜、不可再分的值

2.2 YAML 對象

對象鍵值對使用冒號結(jié)構(gòu)表示 key: value乞巧,冒號后面要加一個空格。也可以使用 key:{key1: value1, key2: value2, ...}摊鸡。還可以使用縮進表示層級關(guān)系:

key:
    child-key: value
    child-key2: value2

較為復(fù)雜的對象格式绽媒,可以使用問號加一個空格代表一個復(fù)雜的 key,配合一個冒號加一個空格代表一個 value

?  
    - complexkey1
    - complexkey2
:
    - complexvalue1
    - complexvalue2

意思即對象的屬性是一個數(shù)組 [complexkey1,complexkey2]免猾,對應(yīng)的值也是一個數(shù)組 [complexvalue1,complexvalue2]是辕。

2.3 YAML 數(shù)組

- 開頭的行表示構(gòu)成一個數(shù)組:

- A
- B
- C

YAML 支持多維數(shù)組,可以使用行內(nèi)表示:

key: [value1, value2, ...]

數(shù)據(jù)結(jié)構(gòu)的子成員是一個數(shù)組猎提,則可以在該項下面縮進一個空格:

-
 - A
 - B
 - C

一個相對復(fù)雜的例子:

companies:
    -
        id: 1
        name: company1
        price: 200W
    -
        id: 2
        name: company2
        price: 500W

意思是 companies 屬性是一個數(shù)組获三,每一個數(shù)組元素又是由 id、name、price 三個屬性構(gòu)成疙教。
數(shù)組也可以使用流式(flow)的方式表示:

companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]

2.4 復(fù)合結(jié)構(gòu)

數(shù)組和對象可以構(gòu)成復(fù)合結(jié)構(gòu)棺聊,例:

languages:
  - Ruby
  - Perl
  - Python
websites:
  YAML: yaml.org
  Ruby: ruby-lang.org
  Python: python.org
  Perl: use.perl.org

轉(zhuǎn)換為 JSON:

{
  languages: [ 'Ruby', 'Perl', 'Python'],
  websites: {
    YAML: 'yaml.org',
    Ruby: 'ruby-lang.org',
    Python: 'python.org',
    Perl: 'use.perl.org'
  }
}

也可以是:

-
  name: Mark McGwire
  hr:   65
  avg:  0.278
-
  name: Sammy Sosa
  hr:   63
  avg:  0.288

或者

- [name        , hr, avg  ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa  , 63, 0.288]

或者

Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
    hr: 63,
    avg: 0.288
  }

2.5 標量

標量是最基本的,不可再分的值贞谓,包括:字符串限佩、布爾值、整數(shù)裸弦、浮點數(shù)祟同、Null、時間烁兰、日期耐亏。

使用一個例子來快速了解標量的基本使用:

boolean:
    - TRUE  #true,True都可以
    - FALSE  #false,F(xiàn)alse都可以
float:
    - 3.14
    - 6.8523015e+5  #可以使用科學(xué)計數(shù)法
int:
    - 123
    - 0b1010_0111_0100_1010_1110    #二進制表示
null:
    nodeName: 'node'
    parent: ~  #使用~表示null
string:
    - 哈哈
    - 'Hello world'  #可以使用雙引號或者單引號包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行沪斟,每一行會被轉(zhuǎn)化成一個空格
date:
    - 2018-02-17    #日期必須使用ISO 8601格式广辰,即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    #時間使用ISO 8601格式,時間和日期之間使用T連接主之,最后使用+代表時區(qū)

YAML’s flow scalars include the plain style (most examples thus far) and two quoted styles. The double-quoted style provides escape sequences. The single-quoted style is useful when escaping is not needed. All flow scalars can span multiple lines; line breaks are always folded.

3 Structures

YAML 使用 --- 分隔文本上下文择吊,... 標識上下文的結(jié)束(Three dots ( “...”) indicate the end of a document without starting a new one, for use in communication channels.):

3.1 引用

& 錨點和 * 別名,可以用來引用:

defaults: &defaults
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults

相當(dāng)于:

defaults:
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  adapter:  postgres
  host:     localhost

test:
  database: myapp_test
  adapter:  postgres
  host:     localhost

& 用來建立錨點(defaults)槽奕,<< 表示合并到當(dāng)前數(shù)據(jù)几睛,* 用來引用錨點。

下面是另一個例子:

- &showell Steve
- Clark
- Brian
- Oren
- *showell

轉(zhuǎn)換為 JavaScript 代碼如下:

[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]

4 Tags

In YAML, untagged nodes are given a type depending on the application. The examples in this specification generally use the seq, map and str types from the fail safe schema. A few examples also use the int, float, and null types from the JSON schema. The repository includes additional types such as binary, omap, set and others.

Explicit typing is denoted with a tag using the exclamation point (“!”) symbol. Global tags are URIs and may be specified in a tag shorthand notation using a handle. Application-specific local tags may also be used.

5 例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粤攒,一起剝皮案震驚了整個濱河市所森,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夯接,老刑警劉巖焕济,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盔几,居然都是意外死亡晴弃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門逊拍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上鞠,“玉大人,你說我怎么就攤上這事芯丧∩盅郑” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵缨恒,是天一觀的道長谴咸。 經(jīng)常有香客問我度硝,道長,這世上最難降的妖魔是什么寿冕? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮椒袍,結(jié)果婚禮上驼唱,老公的妹妹穿的比我還像新娘。我一直安慰自己驹暑,他們只是感情好玫恳,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著优俘,像睡著了一般京办。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帆焕,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天惭婿,我揣著相機與錄音,去河邊找鬼叶雹。 笑死财饥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的折晦。 我是一名探鬼主播钥星,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼满着!你這毒婦竟也來了谦炒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤风喇,失蹤者是張志新(化名)和其女友劉穎宁改,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體响驴,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡透且,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了豁鲤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽誊。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琳骡,靈堂內(nèi)的尸體忽然破棺而出锅论,到底是詐尸還是另有隱情,我是刑警寧澤楣号,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布最易,位于F島的核電站怒坯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏藻懒。R本人自食惡果不足惜剔猿,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嬉荆。 院中可真熱鬧归敬,春花似錦、人聲如沸鄙早。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽限番。三九已至舱污,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弥虐,已是汗流浹背扩灯。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躯舔,地道東北人驴剔。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像粥庄,于是被迫代替她去往敵國和親丧失。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348