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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Python實(shí)現(xiàn)解析ini配置文件的示例詳解目錄楔子ini文件特殊格式小結(jié)

楔子

在開發(fā)過程中,配置文件是少不了的,只不過我們有時(shí)會(huì)將py文件作為配置文件(config.py),然后在其它的模塊中直接導(dǎo)入。這樣做是一個(gè)好主意,不過配置文件是有專門的格式的,比如:ini,yaml,toml等等。

而對(duì)于Python而言,也都有相應(yīng)的庫來解析相應(yīng)格式的文件,下面我們來看看ini文件要如何解析。

ini文件

先來了解一下ini文件的格式:

[satori]

name

=

古明地覺

age

=

16

where

=

東方地靈殿

[koishi]

name

=

古明地戀

age

=

15

where

=

東方地靈殿

[marisa]

name

=

霧雨魔理沙

age

=

17

where

=

魔法森林

;以分號(hào)或井號(hào)開頭表示注釋,不影響

ini文件總分可以分為三塊,分別是:

section:就是寫在[]里面的內(nèi)容,可以把它理解為一個(gè)段;parameter:以key=value的形式出現(xiàn),比如age=16,那么age就是key、16就是value,注意:每個(gè)section都有自己的parameter;注釋:以分號(hào)開頭,無影響,會(huì)被忽略掉。

可以看到結(jié)構(gòu)還是比較清晰的,那么Python要如何解析呢?Python解析ini文件需要使用一個(gè)名叫configparser的庫,這個(gè)庫是自帶的,我們可以直接用。

import

configparser

#

實(shí)例化一個(gè)

ConfigParser

實(shí)例

config

=

configparser.ConfigParser()

#

打開

ini

文件

config.read("cfg.ini",

encoding="utf-8")

#

獲取所有的

section

print(config.sections())

['satori',

'koishi',

'marisa']

#

獲取某一個(gè)

section

的所有

parameter

print(config["satori"])

Section:

satori

#

我們可以像操作字典一樣操作

parameter

print(list(config["satori"]))

['name',

'age',

'where']

print(list(config["satori"].values()))

['古明地覺',

'16',

'東方地靈殿']

print(list(config["satori"].items()))

[('name',

'古明地覺'),

('age',

'16'),

('where',

'東方地靈殿')]

#

獲取某個(gè)

key

對(duì)應(yīng)的

value

#

如果

key

不存在則拋出

KeyError

print(config["marisa"]["where"])

#

也可以調(diào)用

get

方法

#

key

不存在時(shí),指定一個(gè)默認(rèn)值

print(config["marisa"].get("age"))

#

我們發(fā)現(xiàn)

age

居然是一個(gè)字符串

#

因?yàn)槟J(rèn)解析得到的都是字符串

print(config["marisa"]["age"].__class__)

class

'str'

#

可以通過

getint

獲取

#

會(huì)將

value

轉(zhuǎn)成整型,但轉(zhuǎn)化失敗的話會(huì)報(bào)錯(cuò)

#

除了

getint

之外,還有

getfloat、getboolean

print(config["marisa"].getint("age")

==

17)

#

最后也可以直接轉(zhuǎn)成字典

print(dict(config["koishi"]))

{'name':

'古明地戀',

'age':

'15',

'where':

'東方地靈殿'}

print(dict(config))

{'DEFAULT':

Section:

DEFAULT,

'satori':

Section:

satori,

'koishi':

Section:

koishi,

'marisa':

Section:

marisa}

print({k:

dict(v)

for

k,

v

in

config.items()})

{'DEFAULT':

{},

'satori':

{'name':

'古明地覺',

'age':

'16',

'where':

'東方地靈殿'},

'koishi':

{'name':

'古明地戀',

'age':

'15',

'where':

'東方地靈殿'},

'marisa':

{'name':

'霧雨魔理沙',

'age':

'17',

'where':

'魔法森林'}}

"""

可以看到還是比較容易的,因?yàn)閕ni這種文件格式本身就很簡(jiǎn)單。除了讀取文件,我們還可以進(jìn)行寫入。

import

configparser

#

實(shí)例化一個(gè)

ConfigParser

類的實(shí)例

config

=

configparser.ConfigParser()

config["basic"]

=

{"Host":

"127.0.0.1",

"Port":

"8888",

"Username":

"satori"}

config["thread"]

=

{}

config["thread"]["name"]

=

"my_thread"

config["thread"]["num"]

=

"3"

with

open("cfg.ini",

"w",

encoding="utf-8")

as

f:

config.write(f)

雖然成功寫入了,但是我們看到結(jié)果變成了小寫。是的,對(duì)于parameter來說,無論是大寫還是小寫,寫入文件的時(shí)候都會(huì)變成小寫。然后讀取也是,無論ini文件中是大寫還是小寫,讀取之后都會(huì)變成小寫。

注意:大小寫不敏感只是針對(duì)于parameter,對(duì)于section來說還是區(qū)分大小寫的。

特殊格式

我們上面配置的parameter中的key,value都是一個(gè)普通的單詞,但其實(shí)我們還可以配置的更加復(fù)雜一些。

我們操作一波,看看能否正常解析。

import

configparser

#

實(shí)例化一個(gè)

ConfigParser

實(shí)例

config

=

configparser.ConfigParser()

#

打開

ini

文件

config.read("cfg.ini",

encoding="utf-8")

print(dict(config["簡(jiǎn)單值"]))

{'鍵':

'值',

'鍵

里面

有空格':

'合法',

'值

里面

有空格':

'也

法',

'等號(hào)

周圍

空格':

'仍然合法',

'你也使用':

'代替等號(hào)'}

print(dict(config["所有值都是字符串"]))

{'這是字符串':

'123',

'這也是字符串':

'3.14',

'整數(shù)、浮點(diǎn)數(shù)、布爾值都是字符串':

'true'}

#

true

True

yes

都可以轉(zhuǎn)成布爾值

True

#

false

False

no

都可以轉(zhuǎn)成布爾值

False

print(config["所有值都是字符串"].getboolean(

'整數(shù)、浮點(diǎn)數(shù)、布爾值都是字符串'))

print(dict(config["值占多行"]))

{'洪世賢':

'你怎么穿品如的衣服啊\n還用人東西'}

print(dict(config["值為空字符串"]))

{'key1':

'',

'key2':

''}

"""

結(jié)果是正常的,但是很明顯上面這種做法有點(diǎn)閑的沒事了,以后就統(tǒng)一寫成key=value的形式即可。另外如果ini文件中只有key沒有value的話,默認(rèn)是報(bào)錯(cuò)的,但可以通過一個(gè)參數(shù)改變這一點(diǎn):

import

configparser

#

"key

="

這種形式不叫沒有值,它是有值的,值為空字符串

#

"key"

這種形式才是沒有值,解析的時(shí)候默認(rèn)會(huì)報(bào)錯(cuò)

#

可以通過一個(gè)參數(shù)改變這一點(diǎn)

config

=

configparser.ConfigParser(allow_no_value=True)

config.read_string(

"""

[mysqld]

user

=

mysql

skip-bdb

print(dict(config["mysqld"]))

{'user':

'mysql',

'skip-bdb':

None}

"""

除此之外,name之間還可以發(fā)生引用。

import

configparser

config

=

configparser.ConfigParser()

#

可以通過

%(key)s

的方式對(duì)同一個(gè)

section

中的其它

key

進(jìn)行引用

#

所以如果想表示一個(gè)

%

的話,需要寫兩個(gè)

%,因?yàn)樯婕暗睫D(zhuǎn)義

config.read_string("""

[section1]

user

=

古明地覺

age

=

16

info

=

%(user)s--%(age)s

percent

=

80%%

print(dict(config["section1"]))

{'user':

'古明地覺',

'age':

'16',

'info':

'古明地覺--16',

'percent':

'80%'}

"""

還是很簡(jiǎn)單的,如果想引用其它的section中的name要怎么做呢?

import

configparser

#

指定該參數(shù)之后,我們就不能通過

%(name)s

的方式引用了

#

需要使用

${name}

這種格式,顯然更方便了

config

=

configparser.ConfigParser(

interpolation=configparser.ExtendedInterpolation()

config.read_string("""

[DEFAULT]

默認(rèn)的

=

自動(dòng)加入到每一個(gè)

section

[section1]

user

=

古明地覺

age

=

16

info

=

${user}

--

${age}

[section2]

info

=

${section1:user},

${section1:age}

print(dict(config["section1"]))

{'user':

'古明地覺',

'age':

'16',

'info':

'古明地覺

--

16',

'默認(rèn)的':

'自動(dòng)加入到每一個(gè)

section

中'}

print(dict(config["section2"]))

{'info':

'古明地覺,

16',

'默認(rèn)的':

'自動(dòng)加入到每一個(gè)

section

中'}

"""

小結(jié)

以上就是ini文件的一些簡(jiǎn)單用法,以后我們?cè)趯懪渲玫臅r(shí)候,不妨使用一些專門用來表示配置的文件格式,不一定非要寫在py文件里面。

而且使用ini等配置文件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論