




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Python實現(xiàn)解析yaml配置文件的示例詳解目錄楔子字典數(shù)組標(biāo)量引用生成yaml文件
楔子
前面我們介紹了ini格式的配置文件,本次來看看yaml,它的表達(dá)能力相比ini更加的強大。yaml文件以.yml結(jié)尾,在介紹它的語法結(jié)構(gòu)之前我們先來看看yaml的一些基本規(guī)則。
大小寫敏感;使用縮進(jìn)表示層級關(guān)系,并且縮進(jìn)只能用空格、不可以使用tab鍵。縮進(jìn)的空格數(shù)目不重要,只要相同層級的元素左側(cè)對齊即可;#表示注釋,#到行尾的所有字符都會被忽略;
yaml支持的數(shù)據(jù)結(jié)構(gòu)有以下三種:
字典:鍵值對的集合;數(shù)組:多個元素組成的集合;標(biāo)量:單個、不可分割的值;
Python解析yaml則是通過一個名為pyyaml的庫,直接pipinstallpyyaml即可。
下面我們來介紹一下yaml的數(shù)據(jù)結(jié)構(gòu)。
字典
類似于Python的字典,使用鍵值對表示:
name:
satori
#
或者寫成下面的形式
{name:
satori}
Python解析之后會是什么結(jié)果呢?
import
yaml
config
=
"""
name:
satori
#yaml.safe_load:只解析自己信任的輸入
#yaml.unsafe_load:不檢測輸入的安全性
print(yaml.safe_load(config))
{'name':
'satori'}
config
=
"""
{name:
satori}
print(yaml.safe_load(config))
{'name':
'satori'}
"""
在yaml里面,字典的value也可以是一個字典:
info:
{name:
satori,
address:
東方地靈殿}
Python解析的結(jié)果如下:
import
yaml
config
=
"""
info:
{name:
satori,
address:
東方地靈殿}
print(yaml.safe_load(config))
'info':
{'name':
'satori',
'address':
'東方地靈殿'}
"""
還是很簡單的。
數(shù)組
一組連字符開頭的行,構(gòu)成一個數(shù)組。
-
古明地覺
-
古明地戀
-
霧雨魔理沙
#
-
后面要有空格
#
或者寫成下面的形式
[古明地覺,
古明地戀,
霧雨魔理沙]
Python解析的結(jié)果如下:
import
yaml
config
=
"""
-
古明地覺
-
古明地戀
-
霧雨魔理沙
print(yaml.safe_load(config))
['古明地覺',
'古明地戀',
'霧雨魔理沙']
config
=
"""
[古明地覺,
古明地戀,
霧雨魔理沙]
print(yaml.safe_load(config))
['古明地覺',
'古明地戀',
'霧雨魔理沙']
"""
并且數(shù)組的子成員也可以是一個數(shù)組:
-
-古明地覺
-古明地戀
-霧雨魔理沙
Python解析的結(jié)果如下:
import
yaml
config
=
"""
-
古明地覺
-
古明地戀
-
霧雨魔理沙
print(yaml.safe_load(config))
[['古明地覺',
'古明地戀',
'霧雨魔理沙']]
#
更簡潔的寫法
config
=
"""
-
[古明地覺,
古明地戀,
霧雨魔理沙]
print(yaml.safe_load(config))
[['古明地覺',
'古明地戀',
'霧雨魔理沙']]
"""
顯然數(shù)組也可以放在字典中:
#
縮進(jìn)對應(yīng)的空格數(shù)沒有要求,但是必須一樣
#
對于當(dāng)前這個鍵值對而言也可以沒有縮進(jìn)
girl:
-
古明地覺
-
古明地戀
-
霧雨魔理沙
#
或者下面這種形式
girl:
[古明地覺,
古明地戀,
霧雨魔理沙]
#
或者下面這種形式
{girl:
[古明地覺,
古明地戀,
霧雨魔理沙]}
Python解析的結(jié)果如下:
import
yaml
config
=
"""
girl:
-
古明地覺
-
古明地戀
-
霧雨魔理沙
print(yaml.safe_load(config))
{'girl':
['古明地覺',
'古明地戀',
'霧雨魔理沙']}
#
注意:上面的girl對應(yīng)的是數(shù)組
#
因為每個元素前面都有
-
#
但如果沒有的話會發(fā)生什么?
config
=
"""
girl:
古明地覺
古明地戀
霧雨魔理沙
print(yaml.safe_load(config))
{'girl':
'古明地覺
古明地戀
霧雨魔理沙'}
#
我們看到整體相當(dāng)于是一個字符串
#
類似于
html,之間用一個空格代替
#
因此如果內(nèi)容比較長,我們可以寫成多行
#
但是注意:每一行前面必須有空格
然后是一個稍微復(fù)雜的例子:
import
yaml
config
=
"""
girl:
#
會對應(yīng)一個數(shù)組
-
古明地覺
-
古明地戀
-
霧雨魔理沙
place1:
#
雖然不是數(shù)組,但是內(nèi)部是字典的形式
#
所以會對應(yīng)一個含有三個鍵值對的字典
古明地覺:
東方地靈殿
古明地戀:
東方地靈殿
霧雨魔理沙:
魔法森林
place2:
#
是數(shù)組,數(shù)組里面每個元素是一個字典
-
古明地覺:
東方地靈殿
-
古明地戀:
東方地靈殿
-
霧雨魔理沙:
魔法森林
print(yaml.safe_load(config))
'girl':
['古明地覺',
'古明地戀',
'霧雨魔理沙'],
'place1':
{'古明地覺':
'東方地靈殿',
'古明地戀':
'東方地靈殿',
'霧雨魔理沙':
'魔法森林'},
'place2':
[{'古明地覺':
'東方地靈殿'},
{'古明地戀':
'東方地靈殿'},
{'霧雨魔理沙':
'魔法森林'}]
"""
place1對應(yīng)的是一個字典,place2對應(yīng)的是一個數(shù)組。
標(biāo)量
標(biāo)量屬于最基本的、不可再分的值,比較簡單,我們就全部都說了吧。
import
yaml
config
=
"""
int:
123
float:
3.14
bool:
-
true
-
false
#
波浪號表示空
NoneType:
~
datetime:
2025-11-11
12:12:13
#
使用兩個
!
可以進(jìn)行類型強轉(zhuǎn)
#
不過幾乎用不到
cast:
-
!!str
123
-
!!str
true
print(yaml.safe_load(config))
'int':
123,
'float':
3.14,
'bool':
[True,
False],
'NoneType':
None,
'datetime':
datetime.datetime(2025,
11,
11,
12,
12,
13),
'cast':
['123',
'true']
"""
這里可能有人已經(jīng)發(fā)現(xiàn)了,就是字符串不需要加引號,但如果里面有特殊字符怎么辦?所以yaml是支持使用引號括起來的。
import
yaml
config
=
"""
name1:
古明地覺
a
x
$
#
!!
name2:
"古明地覺
a
x
$
#
!!"
name3:
'古明地覺
a
x
$
#
!!'
print(yaml.safe_load(config))
{'name1':
'古明地覺
a
x
$',
'name2':
'古明地覺
a
x
$
#
!!',
'name3':
'古明地覺
a
x
$
#
!!'}
"""
對于yaml而言,字符串默認(rèn)是從第一個不是空格的字符、匹配到最后一個不是空格的字符(如果遇到#直接停止)。因此如果value的前面或后面有空格的話,那么這些空格是不會顯示的,或者當(dāng)中有#,那么#后面的內(nèi)容也不會顯示。
解決辦法是使用單引號或雙引號括起來,如果內(nèi)部還有引號,那么需要輸入兩遍進(jìn)行轉(zhuǎn)義(如果內(nèi)部的引號和外面括起來的引號相同的話)。
引用
對于yaml而言,還支持我們采用和*進(jìn)行引用,舉個例子:
import
yaml
config
=
"""
#
多了一個
db_info_ref
#
相當(dāng)于起了個名字,叫
db_info_ref
db_info:
db_info_ref
host:
port:
5432
user:
postgres
password:
123456
deploy:
os:
Linux
#
將內(nèi)容直接扔到里面來
:
*db_info_ref
print(yaml.safe_load(config))
'db_info':
{'host':
'',
'port':
5432,
'user':
'postgres',
'password':
123456},
'deploy':
{'host':
'',
'port':
5432,
'user':
'postgres',
'password':
123456,
'os':
'Linux'}
"""
用來建立錨點,表示合并當(dāng)前數(shù)據(jù),*表示用來引用錨點。還可以作用在數(shù)組中:
import
yaml
config
=
"""
-
name
古明地覺
-
古明地戀
-
霧雨魔理沙
-
*name
print(yaml.safe_load(config))
['古明地覺',
'古明地戀',
'霧雨魔理沙',
'古明地覺']
"""
生成yaml文件
既然能夠讀取yaml文件,那么自然也能生成yaml文件。
import
yaml
data
=
{
"girl":
[
{"name":
"古明地覺",
"age":
17,
"place":
"東方地靈殿"},
{"name":
"古明地戀",
"age":
16,
"place":
"東方地靈殿"},
{"name":
"霧雨魔理沙",
"age":
16,
"place":
"魔法森林"}
],
"other":
{
"古明地覺":
{"nickname":
["小五",
"少女覺",
"覺大人",
"小五蘿莉"],
"length":
155},
"古明地戀":
{"nickname":
["戀戀"],
"length":
155},
"霧雨魔理沙":
{"nickname":
["摸你傻"],
"length":
155}
}
with
open("cfg.yml",
"w",
encoding="utf-8")
as
f:
yaml.dump(data,
f,
allow_unicode=True,
indent=2)
然后我們看看生成的yml文件長什么樣子。
我們來看yml文件,然后反推出相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。首先整體是一個字典,里面有g(shù)irl和other兩個key。其中g(shù)irl對應(yīng)一個數(shù)組,數(shù)組里面每個元素都是字典,這是符合預(yù)期的。
然后other對應(yīng)一個字典,而且這個字典內(nèi)部有三個鍵值對,key分別是:古明地覺、古明地戀、霧雨魔理沙,各自對應(yīng)的value又是一個字典(內(nèi)部有l(wèi)ength、nickname兩個key,length對應(yīng)整型、nickname對應(yīng)列表)。
最后再看一個本人之前項目中的yml文件,可以猜猜看解析出來長什么樣子。
解析一下看看和你想的是不是一樣的。
import
yaml
with
open(".gitlab-ci.yml",
"r",
encoding="utf-8")
as
f:
data
=
f.read()
data
=
yaml.safe_load(data)
print(data)
'stages':
['test'],
'cache':
{'key':
'${CI_COMMIT_REF_SLUG}',
'paths':
['.cache/pip']},
'variables':
{'PIP_CACHE_DIR':
'$CI_PROJECT_DIR/.cache/pip'},
'test':
{'stage':
'test',
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2013年寧夏事業(yè)單位考試公共基礎(chǔ)知識真題及答案解析
- 2025共同借款合同范本
- 軟件測試工程師復(fù)習(xí)要點解析
- 領(lǐng)導(dǎo)科學(xué)中團隊協(xié)作的關(guān)鍵因素試題及答案
- 影視行業(yè)2025年工業(yè)化制作流程成本控制與質(zhì)量控制策略報告
- 2025年“健康中國”戰(zhàn)略下基層醫(yī)療服務(wù)能力提升與人才培養(yǎng)報告
- 燃?xì)夤艿览匣赂脑旖ㄔO(shè)項目實施方案
- 咖啡廳運營管理方案
- 互聯(lián)網(wǎng)與科技公司運營管理方案
- 2025年文化產(chǎn)業(yè)金融政策環(huán)境分析:融資渠道拓展與風(fēng)險管理
- DB3502-Z 5043-2018 浮筑樓板應(yīng)用技術(shù)規(guī)程
- 2019年4月自考00322中國行政史試題及答案含解析
- 成都市新津區(qū)招聘教師考試試題及答案
- 小升初語文真題專項訓(xùn)練專題6+文學(xué)常識與名著閱讀(有解析)
- 埃塞俄比亞 多山之國
- 電梯安全教育培訓(xùn)知識
- 外國名人羅斯福介紹
- 人效提升方案措施
- 2023學(xué)年完整公開課版劃船歌
- 嬰幼兒安全與意外事件防范培訓(xùn)課件
- AIAG-VDA-PFMEA表格模板(自動計算AP)
評論
0/150
提交評論