簡(jiǎn)單介紹Python的第三方庫(kù)yaml
一、yaml基本介紹
yaml是Python的第三方庫(kù)。YAML is a human friendly data serialization standard for all programming languages(YAML是一個(gè)對(duì)所有編程語(yǔ)言都很友好的數(shù)據(jù)序列化標(biāo)準(zhǔn))。
但為了強(qiáng)調(diào)該語(yǔ)言以數(shù)據(jù)為中心,而不是以標(biāo)記語(yǔ)言為重點(diǎn),而用返璞詞重新命名。它是一種直觀的能夠被電腦識(shí)別的數(shù)據(jù)序列化格式,是一種可讀性高且容易被人類閱讀、容易和腳本語(yǔ)言(不僅僅是Python)交互,用于表達(dá)資料序列的編程語(yǔ)言。YAML語(yǔ)言的本質(zhì)是 一種通用的數(shù)據(jù)串行化格式。
二、適用場(chǎng)景
- 在腳步語(yǔ)言中使用,實(shí)現(xiàn)簡(jiǎn)單,解析成本低;
- 序列化;
- 編程時(shí)寫(xiě)配置文件,比xml快,比ini文檔功能更強(qiáng)。
- YAML是專門(mén)用于寫(xiě)配置文件的語(yǔ)言,非常簡(jiǎn)潔和強(qiáng)大,遠(yuǎn)比JSON格式方便。
三、基本的語(yǔ)法規(guī)則
- 大小寫(xiě)敏感;
- 使用縮進(jìn)表示層級(jí)關(guān)系;
- 縮進(jìn)時(shí)不允許使用Tab鍵,只允許使用空格;
- 縮進(jìn)的空格數(shù)目不重要,只要相同層級(jí)的元素左側(cè)對(duì)齊即可(一般2個(gè)或4個(gè)空格);
- #表示注釋當(dāng)前行。
四、YAML支持的三種數(shù)據(jù)結(jié)構(gòu)
- 對(duì)象:即鍵值對(duì)的集合,又稱為映射(mapping)/哈希(hashes)/字典(dictionary);
- 數(shù)組:一組按次序排列的值,又稱為序列(sequence)/列表(list);
- 純量:?jiǎn)蝹€(gè)的、不可再分的值。
4.1 對(duì)象
使用冒號(hào)代表,格式為 key: value。冒號(hào)后須加一個(gè)空格。
使用縮進(jìn)表示層級(jí)關(guān)系,如下:
key: child_key1: value1 child-key2: value2
YAML還支持流式(flow)語(yǔ)法表示對(duì)象,上例可寫(xiě)成:
key: {child_key1: value1, child_key2: value2}
這在Python中是 字典嵌套字典,是這么寫(xiě)的:
"key": { "child_key1":"value1", "child_key2":"value2" }
較為復(fù)雜的對(duì)象格式,可使用 一個(gè)問(wèn)號(hào) 加一個(gè)空格代表一個(gè)復(fù)雜的key,配合一個(gè)冒號(hào)加一個(gè)空格 代表一個(gè)value:
? - complex_key1 - complex_key2 : - complex_value1 - complex_value2
上述表示:對(duì)象的屬性是一個(gè)數(shù)組[complex_key1, complex_key2],其對(duì)應(yīng)的值也是一個(gè)數(shù)組[complex_value1, complex_value2]。
4.2 數(shù)組
使用一個(gè)短橫線 加一個(gè)空格代表一個(gè)數(shù)組項(xiàng):
hobby: - python - test
也可以這樣說(shuō):
- - python - test
可簡(jiǎn)單理解為:[[python, test]]
再看一個(gè)相對(duì)復(fù)雜的例子:
role: - id: 1 name: developer auth: dev - id: 2 name: tester auth: test
可理解為:role屬性是一個(gè)數(shù)組,每個(gè)數(shù)組元素又是由id、name、auth 3個(gè)屬性構(gòu)成。
用流式(flow)的方式表示如下:
role: [{id: 1, name: developer, auth: dev}, {id: 2, name: tester, auth: test}]
4.2.1 對(duì)象和數(shù)組
可結(jié)合使用,形成復(fù)合結(jié)構(gòu)
languages: - Ruby - Perl - Python websites: YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org
4.3 純量
純量是最基本的、不可再分的值。YAML提供了多種常量結(jié)構(gòu):整數(shù)、浮點(diǎn)數(shù)、字符串、NULL、日期、布爾值、時(shí)間。
int: - 123 - 0b1010_0111_0100_1010_1110 # 二進(jìn)制表示 float: - 3.14159 - 6.6e+5 # 可使用科學(xué)計(jì)數(shù)法 string: - 'Hello world!' # 可使用雙引號(hào)或單引號(hào)包裹特殊字符,雙引號(hào)不會(huì)對(duì)特殊字符轉(zhuǎn)義。 - newline newline2 # 字符串可拆成多行,每一行會(huì)被轉(zhuǎn)化成一個(gè)空格 null: nodeName: 'node' parent: ~ # 使用 ~ 表示null boolean: - TRUE # true 或True都可以 - FALSE # false 或False都可以 date: - 2018-12-29 # 日期必須使用ISO 8601格式,即yyyy-MM-dd datetime: - 2018-12-29T18:43:21+08:00 #時(shí)間使用ISO 8601格式,時(shí)間和日期之間使用T連接,最后使用+代表時(shí)區(qū)
4.4 還有一些特殊符號(hào)
4.4.1 — YAML可在同一個(gè)文件中,使用—表示一個(gè)文檔的開(kāi)始
server: address: 192.168.1.100 --- spring: profiles: development server: address: 127.0.0.1 --- spring: profiles: production server: address: 192.168.1.120
上述例子定義兩個(gè)profile,一個(gè)development、一個(gè)production。
也可以用 —來(lái)分割不同的內(nèi)容,比如記錄日志:
--- Time: 2018-12-29T19:09:30+08:00 User: ed Warning: This is an error message for the log file. --- Time: 2018-12-29T19:11:45+08:00 User: ed Warning: A slightly different error message.
4.4.2 …和—配合使用,在一個(gè)配置文件中代表一個(gè)的結(jié)束
--- time: 19:13:09 player: Tim action: strike ... --- time: 20:14:45 player: Lily action: grand ...
此例相當(dāng)于在一個(gè)yaml文件中連續(xù)寫(xiě)了兩個(gè)yaml配置項(xiàng)。
4.4.3 YAML中使用!!做類型強(qiáng)行轉(zhuǎn)換
string: - !!str 123456 - !!str true
相當(dāng)于將數(shù)字和布爾類型強(qiáng)轉(zhuǎn)為字符串(允許轉(zhuǎn)換的類型還有很多)。
4.4.4 > 在字符串中表示折疊換行;| 保留換行。這兩個(gè)符號(hào)是YAML中字符串經(jīng)常使用的符號(hào)
acomplistment: > Mark set a major league home run record in 1998. status: | 65 Home Runs 0.278 Batting Average
accomplistment的結(jié)果為:
accomplistment=Mark set a major league home run record in 1998.
status的結(jié)果為:
status=65 Home Runs 0.278 Batting Average
4.4.5 引用。重復(fù)的內(nèi)容在YAML中可使用&來(lái)完成錨點(diǎn)定義,用*來(lái)完成錨點(diǎn)引用
hr: - Mark McGwire - &SS Sammy Sosa rbi: - *SS - Ken Griffey
在hr中,使用&SS為Sammy Sosa設(shè)置了一個(gè)錨點(diǎn)(引用),名稱為SS;在rbi中,使用*SS完成了錨點(diǎn)使用。結(jié)果是:
{rbi=[Mark McGwire, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]}
也可以這樣定義:
SS: &SS Sammy Sosa hr: - Mark McGwire - *SS rbi: - *SS - Ken Griffey
還可以用錨點(diǎn)定義更復(fù)雜的內(nèi)容:
default: &default - Mark McGwire - Sammy Sosa hr: *default
hr相當(dāng)于引用default數(shù)組。不過(guò),hr: *default須寫(xiě)在同一行。
4.4.6 合并內(nèi)容。主要是和錨點(diǎn)配合使用,可將一個(gè)錨點(diǎn)內(nèi)容直接合并到一個(gè)對(duì)象中
merge: - &CENTER { x: 1, y: 2 } - &LEFT { x: 0, y: 2 } - &BIG { r: 10 } - &SMALL { r: 1 } sample1: <<: *CENTER r: 10 sample2: << : [ *CENTER, *BIG ] other: haha sample3: << : [ *CENTER, *BIG ] r: 100
在merge中,定義了四個(gè)錨點(diǎn),分別在sample中使用。
sample1中,<<: *CENTER意思是引用{x: 1,y: 2},并且合并到sample1中,那么合并的結(jié)果為:sample1={r=10, y=2, x=1}
sample2中,<<: [*CENTER, *BIG] 意思是聯(lián)合引用{x: 1,y: 2}和{r: 10},并且合并到sample2中,那么合并的結(jié)果為:sample2={other=haha, x=1, y=2, r=10}
sample3中,引入了*CENTER, *BIG,還使用了r: 100覆蓋了引入的r: 10,所以sample3值為:sample3={r=100, y=2, x=1}
有了合并,我們就可以在配置中,把相同的基礎(chǔ)配置抽取出來(lái),在不同的子配置中合并引用即可。
五、實(shí)戰(zhàn)
5.1 安裝yaml
yaml包名是 pyyaml,但導(dǎo)入是yaml。
5.2 Python使用yaml
以 【用Python 讀取yaml文件(后綴可為 .yml 或 .yaml)】為例:先用open方法讀取文件數(shù)據(jù),再通過(guò)load方法轉(zhuǎn)成字典(load方法跟json的load是相似的)。
在同一個(gè)文件夾下,編寫(xiě)yaml文件,名為 cfg.yml,內(nèi)容如下:
nb: user: admin psw: 123456
編寫(xiě)讀取yaml文件的.py文件,名為 readyml.py,內(nèi)容如下:
import yaml import os curPath = os.path.dirname(os.path.realpath(__file__)) # 獲取當(dāng)前腳本所在文件夾路徑 ymlPath = os.path.join(curPath, "cfg.yml") # 獲取yaml文件路徑 # 用open方法打開(kāi)直接讀取 f = open(ymlPath, 'r') cfg = f.read() print(type(cfg)) # 讀取的結(jié)果是 字符串 print(cfg) d = yaml.load(cfg) # 用load方法轉(zhuǎn)字典 print(d) print(type(d)) a = {'name': 'Tom', 'race': 'cat', 'traits': ['Two_Hand', 'Two_Eye'] } ret = yaml.dump(a) print(ret) print(type(ret))
其中,最重要的兩個(gè)方法:
- load(),解析yaml文檔,返回一個(gè)Python對(duì)象;
- load_all(),如果是string或文件包含幾塊yaml文檔,可用該方法來(lái)解析全部的文檔,生成一個(gè)迭代器;
- dump(),將一個(gè)Python對(duì)象生成為一個(gè)yaml文檔;
- dump_all(),將多個(gè)段輸出到一個(gè)yaml文檔中。
到此這篇關(guān)于簡(jiǎn)單介紹Python的第三方庫(kù)yaml的文章就介紹到這了,更多相關(guān)Python庫(kù)yaml內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3.x實(shí)現(xiàn)base64加密和解密
這篇文章主要為大家詳細(xì)介紹了python3.x實(shí)現(xiàn)base64加密和解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03Django事務(wù)transaction的使用以及多個(gè)裝飾器問(wèn)題
這篇文章主要介紹了Django事務(wù)transaction的使用以及多個(gè)裝飾器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08解決py2exe打包后,總是多顯示一個(gè)DOS黑色窗口的問(wèn)題
今天小編就為大家分享一篇解決py2exe打包后,總是多顯示一個(gè)DOS黑色窗口的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06關(guān)于DataFrame取值操作總結(jié)(取指定列指定值的行)
這篇文章主要介紹了關(guān)于DataFrame取值操作總結(jié)(取指定列指定值的行),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Python如何通過(guò)內(nèi)存管理提升程序執(zhí)行效率
Python提供了自動(dòng)內(nèi)存管理的功能,但是如果不小心使用,可能會(huì)導(dǎo)致內(nèi)存泄漏和性能問(wèn)題,所以巧妙使用內(nèi)存管理是提高Python執(zhí)行效率的關(guān)鍵,下面就來(lái)和大家仔細(xì)講講Python的內(nèi)存管理技巧吧2023-06-06python實(shí)現(xiàn)數(shù)字炸彈游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)數(shù)字炸彈游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07python庫(kù)構(gòu)建之pyproject.toml配置文件詳解
pyproject.toml是Python項(xiàng)目標(biāo)準(zhǔn)化配置文件,由PEP?518引入,用于定義構(gòu)建系統(tǒng)、項(xiàng)目元數(shù)據(jù)和依賴管理,它替代了傳統(tǒng)的setup.cfg文件,通過(guò)指定構(gòu)建工具如setuptools或poetry,管理項(xiàng)目依賴,配置工具行為等,需要的朋友可以參考下2024-09-09