簡單介紹Python的第三方庫yaml
一、yaml基本介紹
yaml是Python的第三方庫。YAML is a human friendly data serialization standard for all programming languages(YAML是一個對所有編程語言都很友好的數據序列化標準)。
但為瞭強調該語言以數據為中心,而不是以標記語言為重點,而用返璞詞重新命名。它是一種直觀的能夠被電腦識別的數據序列化格式,是一種可讀性高且容易被人類閱讀、容易和腳本語言(不僅僅是Python)交互,用於表達資料序列的編程語言。YAML語言的本質是 一種通用的數據串行化格式。
二、適用場景
- 在腳步語言中使用,實現簡單,解析成本低;
- 序列化;
- 編程時寫配置文件,比xml快,比ini文檔功能更強。
- YAML是專門用於寫配置文件的語言,非常簡潔和強大,遠比JSON格式方便。
三、基本的語法規則
- 大小寫敏感;
- 使用縮進表示層級關系;
- 縮進時不允許使用Tab鍵,隻允許使用空格;
- 縮進的空格數目不重要,隻要相同層級的元素左側對齊即可(一般2個或4個空格);
- #表示註釋當前行。
四、YAML支持的三種數據結構
- 對象:即鍵值對的集合,又稱為映射(mapping)/哈希(hashes)/字典(dictionary);
- 數組:一組按次序排列的值,又稱為序列(sequence)/列表(list);
- 純量:單個的、不可再分的值。
4.1 對象
使用冒號代表,格式為 key: value。冒號後須加一個空格。
使用縮進表示層級關系,如下:
key: child_key1: value1 child-key2: value2
YAML還支持流式(flow)語法表示對象,上例可寫成:
key: {child_key1: value1, child_key2: value2}
這在Python中是 字典嵌套字典,是這麼寫的:
"key": { "child_key1":"value1", "child_key2":"value2" }
較為復雜的對象格式,可使用 一個問號 加一個空格代表一個復雜的key,配合一個冒號加一個空格 代表一個value:
? - complex_key1 - complex_key2 : - complex_value1 - complex_value2
上述表示:對象的屬性是一個數組[complex_key1, complex_key2],其對應的值也是一個數組[complex_value1, complex_value2]。
4.2 數組
使用一個短橫線 加一個空格代表一個數組項:
hobby: - python - test
也可以這樣說:
- - python - test
可簡單理解為:[[python, test]]
再看一個相對復雜的例子:
role: - id: 1 name: developer auth: dev - id: 2 name: tester auth: test
可理解為:role屬性是一個數組,每個數組元素又是由id、name、auth 3個屬性構成。
用流式(flow)的方式表示如下:
role: [{id: 1, name: developer, auth: dev}, {id: 2, name: tester, auth: test}]
4.2.1 對象和數組
可結合使用,形成復合結構
languages: - Ruby - Perl - Python websites: YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org
4.3 純量
純量是最基本的、不可再分的值。YAML提供瞭多種常量結構:整數、浮點數、字符串、NULL、日期、佈爾值、時間。
int: - 123 - 0b1010_0111_0100_1010_1110 # 二進制表示 float: - 3.14159 - 6.6e+5 # 可使用科學計數法 string: - 'Hello world!' # 可使用雙引號或單引號包裹特殊字符,雙引號不會對特殊字符轉義。 - newline newline2 # 字符串可拆成多行,每一行會被轉化成一個空格 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 #時間使用ISO 8601格式,時間和日期之間使用T連接,最後使用+代表時區
4.4 還有一些特殊符號
4.4.1 — YAML可在同一個文件中,使用—表示一個文檔的開始
server: address: 192.168.1.100 --- spring: profiles: development server: address: 127.0.0.1 --- spring: profiles: production server: address: 192.168.1.120
上述例子定義兩個profile,一個development、一個production。
也可以用 —來分割不同的內容,比如記錄日志:
--- 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 …和—配合使用,在一個配置文件中代表一個的結束
--- time: 19:13:09 player: Tim action: strike ... --- time: 20:14:45 player: Lily action: grand ...
此例相當於在一個yaml文件中連續寫瞭兩個yaml配置項。
4.4.3 YAML中使用!!做類型強行轉換
string: - !!str 123456 - !!str true
相當於將數字和佈爾類型強轉為字符串(允許轉換的類型還有很多)。
4.4.4 > 在字符串中表示折疊換行;| 保留換行。這兩個符號是YAML中字符串經常使用的符號
acomplistment: > Mark set a major league home run record in 1998. status: | 65 Home Runs 0.278 Batting Average
accomplistment的結果為:
accomplistment=Mark set a major league home run record in 1998.
status的結果為:
status=65 Home Runs 0.278 Batting Average
4.4.5 引用。重復的內容在YAML中可使用&來完成錨點定義,用*來完成錨點引用
hr: - Mark McGwire - &SS Sammy Sosa rbi: - *SS - Ken Griffey
在hr中,使用&SS為Sammy Sosa設置瞭一個錨點(引用),名稱為SS;在rbi中,使用*SS完成瞭錨點使用。結果是:
{rbi=[Mark McGwire, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]}
也可以這樣定義:
SS: &SS Sammy Sosa hr: - Mark McGwire - *SS rbi: - *SS - Ken Griffey
還可以用錨點定義更復雜的內容:
default: &default - Mark McGwire - Sammy Sosa hr: *default
hr相當於引用default數組。不過,hr: *default須寫在同一行。
4.4.6 合並內容。主要是和錨點配合使用,可將一個錨點內容直接合並到一個對象中
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中,定義瞭四個錨點,分別在sample中使用。
sample1中,<<: *CENTER意思是引用{x: 1,y: 2},並且合並到sample1中,那麼合並的結果為:sample1={r=10, y=2, x=1}
sample2中,<<: [*CENTER, *BIG] 意思是聯合引用{x: 1,y: 2}和{r: 10},並且合並到sample2中,那麼合並的結果為:sample2={other=haha, x=1, y=2, r=10}
sample3中,引入瞭*CENTER, *BIG,還使用瞭r: 100覆蓋瞭引入的r: 10,所以sample3值為:sample3={r=100, y=2, x=1}
有瞭合並,我們就可以在配置中,把相同的基礎配置抽取出來,在不同的子配置中合並引用即可。
五、實戰
5.1 安裝yaml
yaml包名是 pyyaml,但導入是yaml。
5.2 Python使用yaml
以 【用Python 讀取yaml文件(後綴可為 .yml 或 .yaml)】為例:先用open方法讀取文件數據,再通過load方法轉成字典(load方法跟json的load是相似的)。
在同一個文件夾下,編寫yaml文件,名為 cfg.yml,內容如下:
nb: user: admin psw: 123456
編寫讀取yaml文件的.py文件,名為 readyml.py,內容如下:
import yaml import os curPath = os.path.dirname(os.path.realpath(__file__)) # 獲取當前腳本所在文件夾路徑 ymlPath = os.path.join(curPath, "cfg.yml") # 獲取yaml文件路徑 # 用open方法打開直接讀取 f = open(ymlPath, 'r') cfg = f.read() print(type(cfg)) # 讀取的結果是 字符串 print(cfg) d = yaml.load(cfg) # 用load方法轉字典 print(d) print(type(d)) a = {'name': 'Tom', 'race': 'cat', 'traits': ['Two_Hand', 'Two_Eye'] } ret = yaml.dump(a) print(ret) print(type(ret))
其中,最重要的兩個方法:
- load(),解析yaml文檔,返回一個Python對象;
- load_all(),如果是string或文件包含幾塊yaml文檔,可用該方法來解析全部的文檔,生成一個迭代器;
- dump(),將一個Python對象生成為一個yaml文檔;
- dump_all(),將多個段輸出到一個yaml文檔中。
到此這篇關於簡單介紹Python的第三方庫yaml的文章就介紹到這瞭,更多相關Python庫yaml內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python YAML文件的讀寫操作詳解
- Python常用配置文件ini、json、yaml讀寫總結
- python操作yaml的方法詳解
- Python使用yaml模塊操作YAML文檔的方法
- python入門課程第四講之內置數據類型有哪些