Python實現(xiàn)解析yaml配置文件的示例詳解_第1頁
Python實現(xiàn)解析yaml配置文件的示例詳解_第2頁
Python實現(xiàn)解析yaml配置文件的示例詳解_第3頁
Python實現(xiàn)解析yaml配置文件的示例詳解_第4頁
Python實現(xiàn)解析yaml配置文件的示例詳解_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論