什么是yaml
1、yaml [?j?m?l]: Yet Another Markup Language :另一種標(biāo)記語(yǔ)言。yaml 是專門(mén)用來(lái)寫(xiě)配置文件的語(yǔ)言,非常簡(jiǎn)潔和強(qiáng)大,
2、支持多種語(yǔ)言:python、js、golang、java、c、c++
3、yaml語(yǔ)法
- 大小寫(xiě)敏感
- 使用縮進(jìn)表示層級(jí)關(guān)系
- 縮進(jìn)時(shí)不允許使用Tab鍵,只允許使用空格。
- 縮進(jìn)的空格數(shù)目不重要,只要相同層級(jí)的元素左側(cè)對(duì)齊即可
- #號(hào)表示注釋
4、yaml支持的數(shù)據(jù)結(jié)構(gòu)有三種:
對(duì)象:鍵值對(duì)的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
數(shù)組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
純量(scalars):?jiǎn)蝹€(gè)的、不可再分的值。字符串、布爾值、整數(shù)、浮點(diǎn)數(shù)、Null、時(shí)間、日期
在實(shí)際工作中,我們經(jīng)常使用yaml文件來(lái)存儲(chǔ)數(shù)據(jù)或者存儲(chǔ)一些必要的配置,那么在python中,我們?nèi)绾螌⒋鎯?chǔ)在yaml文件中的數(shù)據(jù)轉(zhuǎn)化為python可以識(shí)別的數(shù)據(jù)類(lèi)型呢?
安裝yaml
使用pip安裝pyyaml模塊
pip install pyyaml
python讀取yaml案例
用python讀取yaml文件案例如下,先用open方法讀取文件數(shù)據(jù),再通過(guò)load方法轉(zhuǎn)成字典,這個(gè)load跟json里面的load是相似的。
# coding:utf-8
import yaml
import os
# 獲取當(dāng)前腳本所在文件夾路徑
curPath = os.path.dirname(os.path.realpath(__file__))
# 獲取yaml文件路徑
yamlPath = os.path.join(curPath, "configyaml.yaml")
# open方法打開(kāi)直接讀出來(lái)
with open(yamlPath, 'r', encoding='utf-8') as f:
config = f.read()
print(type(config)) # 讀出來(lái)是字符串
print(config)
d = yaml.load(config,Loader=yaml.FullLoader) # 用load方法轉(zhuǎn)字典
print(d)
print(d.get('time1'))
print(type(d))
yaml寫(xiě)法及與python對(duì)應(yīng)關(guān)系
1、鍵值對(duì)(dict)
字典寫(xiě)法
# yaml
user: admin
psw: 123456
嵌套字典寫(xiě)法
# yaml
user1:
user: admin
psw: 123456
2、序列(list)
yaml里面寫(xiě)一個(gè)數(shù)組,前面加一個(gè)‘-’符號(hào),如下
#yaml
- admin1: 111111
- admin2: 222222
- admin3: 333333
對(duì)應(yīng)python的列表嵌套字典
[{'admin1': 111111},
{'admin2': 222222},
{'admin3': 333333}]
3、純量(str)
1.int和float類(lèi)型的數(shù)字
n1: 12.30
2.布爾值用true和false表示
n2: true
n3: false
3.None用~表示
n4: ~
4.時(shí)間采用 ISO8601 格式。
time1: 2001-12-14t21:59:43.10-05:00
對(duì)應(yīng)python
{'time1': datetime.datetime(2001, 12, 15, 2, 59, 43, 100000)}
5.日期采用復(fù)合 iso8601 格式的年、月、日表示。
date1: 2017-07-31
對(duì)應(yīng)python
{'date1': datetime.date(2017, 7, 31)}
6.使用兩個(gè)感嘆號(hào),強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類(lèi)型。
int轉(zhuǎn)str
n6: !!str 123
對(duì)應(yīng)python
{'n6': '123'}
bool值轉(zhuǎn)str
n7: !!str true
對(duì)應(yīng)python
{'n7': 'true'}
7.在yaml文件寫(xiě)入以下內(nèi)容:
n1: 12.30
n2: true
n3: false
n4: ~
time1: 2018-04-18t21:59:43.10+08:00
date1: 2018-04-18
n6: !!str 123
n7: !!str true
python讀取結(jié)果:
{'n1': 12.3,
'n2': True,
'n3': False,
'n4': None,
'time1': datetime.datetime(2018, 4, 18, 21, 59, 43, 100000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
'date1': datetime.date(2018, 4, 18),
'n6': '123',
'n7': 'true'}
4、混合使用
1.list嵌套dict,在yaml里面寫(xiě)入如下內(nèi)容:
- user: admin1
psw: '123456'
- user: admin2
psw: '111111'
- user: admin3
psw: '222222'
用python讀取出來(lái)的結(jié)果:
[{'user': 'admin1', 'psw': '123456'},{'user': 'admin2', 'psw': '111111'},{'user': 'admin3', 'psw': '222222'}]
2.dict嵌套list,在yaml里面寫(xiě)入如下內(nèi)容:
nub1:
- admin1
- '123456'
nb2:
- admin2
- '111111'
nb3:
- admin3
- '222222'
用python讀取出來(lái)的結(jié)果:
{'nub1': ['admin1', '123456'], 'nb2': ['admin2', '111111'], 'nb3': ['admin3', '222222']}