最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)解析ini配置文件的示例詳解

 更新時(shí)間:2022年09月16日 09:19:27   作者:古明地覺(jué)  
在開(kāi)發(fā)過(guò)程中,配置文件是少不了的,而且配置文件是有專(zhuān)門(mén)的格式的,比如:ini,?yaml,?toml?等等。而對(duì)于?Python?而言,也都有相應(yīng)的庫(kù)來(lái)解析相應(yīng)格式的文件,下面我們來(lái)看看?ini?文件要如何解析

楔子

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

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

ini 文件

先來(lái)了解一下 ini 文件的格式:

[satori]
name?=?古明地覺(jué)
age?=?16
where?=?東方地靈殿

[koishi]
name?=?古明地戀
age?=?15
where?=?東方地靈殿

[marisa]
name?=?霧雨魔理沙
age?=?17
where?=?魔法森林

; 以分號(hào)或井號(hào)開(kāi)頭表示注釋?zhuān)挥绊?/strong>

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

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

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

import?configparser

#?實(shí)例化一個(gè)?ConfigParser?實(shí)例
config?=?configparser.ConfigParser()
#?打開(kāi)?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()))
"""
['古明地覺(jué)',?'16',?'東方地靈殿']
"""
print(list(config["satori"].items()))
"""
[('name',?'古明地覺(jué)'),?('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"))
"""
17
"""
#?我們發(fā)現(xiàn)?age?居然是一個(gè)字符串
#?因?yàn)槟J(rèn)解析得到的都是字符串
print(config["marisa"]["age"].__class__)
"""
<class?'str'>
"""

#?可以通過(guò)?getint?獲取
#?會(huì)將?value?轉(zhuǎn)成整型,但轉(zhuǎn)化失敗的話(huà)會(huì)報(bào)錯(cuò)
#?除了?getint?之外,還有?getfloat、getboolean
print(config["marisa"].getint("age")?==?17)
"""
True
"""

#?最后也可以直接轉(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':?'古明地覺(jué)',?
????????????'age':?'16',?
????????????'where':?'東方地靈殿'},?
?'koishi':?{'name':?'古明地戀',?
????????????'age':?'15',?
????????????'where':?'東方地靈殿'},?
?'marisa':?{'name':?'霧雨魔理沙',?
????????????'age':?'17',?
????????????'where':?'魔法森林'}}
"""

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

import?configparser

#?實(shí)例化一個(gè)?ConfigParser?類(lèi)的實(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)

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

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

特殊格式

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

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

import?configparser

#?實(shí)例化一個(gè)?ConfigParser?實(shí)例
config?=?configparser.ConfigParser()
#?打開(kāi)?ini?文件
config.read("cfg.ini",?encoding="utf-8")

print(dict(config["簡(jiǎn)單值"]))
"""
{'鍵':?'值',?
?'鍵?里面?有空格':?'合法',?
?'值?里面?有空格':?'也?合?法',?
?'等號(hào)?周?chē)?有?空格':?'仍然合法',?
?'你也使用':?'代替等號(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ù)、布爾值都是字符串'))
"""
True
"""

print(dict(config["值占多行"]))
"""
{'洪世賢':?'你怎么穿品如的衣服啊\n還用人東西'}
"""

print(dict(config["值為空字符串"]))
"""
{'key1':?'',?'key2':?''}
"""

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

import?configparser

#?"key?="?這種形式不叫沒(méi)有值,它是有值的,值為空字符串
#?"key"?這種形式才是沒(méi)有值,解析的時(shí)候默認(rèn)會(huì)報(bào)錯(cuò)
#?可以通過(guò)一個(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()

#?可以通過(guò)?%(key)s?的方式對(duì)同一個(gè)?section?中的其它?key?進(jìn)行引用
#?所以如果想表示一個(gè)?%?的話(huà),需要寫(xiě)兩個(gè)?%,因?yàn)樯婕暗睫D(zhuǎn)義
config.read_string("""
[section1]
user?=?古明地覺(jué)
age?=?16
info?=?%(user)s--%(age)s?
percent?=?80%%?
""")

print(dict(config["section1"]))
"""
{'user':?'古明地覺(jué)',?'age':?'16',?
?'info':?'古明地覺(jué)--16',?'percent':?'80%'}
"""

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

import?configparser

#?指定該參數(shù)之后,我們就不能通過(guò)?%(name)s?的方式引用了
#?需要使用?${name}?這種格式,顯然更方便了
config?=?configparser.ConfigParser(
????interpolation=configparser.ExtendedInterpolation()
)

config.read_string("""
[DEFAULT]
默認(rèn)的?=?自動(dòng)加入到每一個(gè)?section?中

[section1]
user?=?古明地覺(jué)
age?=?16
info?=?${user}?--?${age}?

[section2]
info?=?${section1:user},?${section1:age}
""")

print(dict(config["section1"]))
"""
{'user':?'古明地覺(jué)',?
?'age':?'16',?
?'info':?'古明地覺(jué)?--?16',?
?'默認(rèn)的':?'自動(dòng)加入到每一個(gè)?section?中'}
"""
print(dict(config["section2"]))
"""
{'info':?'古明地覺(jué),?16',?
?'默認(rèn)的':?'自動(dòng)加入到每一個(gè)?section?中'}
"""

小結(jié)

以上就是 ini 文件的一些簡(jiǎn)單用法,以后我們?cè)趯?xiě)配置的時(shí)候,不妨使用一些專(zhuān)門(mén)用來(lái)表示配置的文件格式,不一定非要寫(xiě)在 py 文件里面。

而且使用 ini 等配置文件的一個(gè)好處就是,即便不懂 Python 的人也能看懂;或者這個(gè)配置文件不一定是要由你來(lái)寫(xiě),可能是別人寫(xiě),而那個(gè)人不用 Python,但是通過(guò) ini 文件的話(huà)就省去了溝通的成本。

后續(xù)我們繼續(xù)介紹其它種類(lèi)的配置文件,比如 yaml, toml,因?yàn)?ini 雖然簡(jiǎn)單,但表達(dá)能力還是很有限的。而 yaml 和 toml 的表達(dá)能力要更豐富,應(yīng)用領(lǐng)域也要更廣一些。

以上就是Python實(shí)現(xiàn)解析ini配置文件的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python解析ini配置文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django實(shí)戰(zhàn)之用戶(hù)認(rèn)證(用戶(hù)登錄與注銷(xiāo))

    Django實(shí)戰(zhàn)之用戶(hù)認(rèn)證(用戶(hù)登錄與注銷(xiāo))

    這篇文章主要介紹了Django實(shí)戰(zhàn)之用戶(hù)認(rèn)證(用戶(hù)登錄與注銷(xiāo)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • python 從list中隨機(jī)取值的方法

    python 從list中隨機(jī)取值的方法

    這篇文章主要介紹了python 從list中隨機(jī)取值的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖

    python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖

    這篇文章主要介紹了python繪制發(fā)散型柱狀圖+誤差陰影時(shí)間序列圖+雙坐標(biāo)系時(shí)間序列圖+繪制金字塔圖,詳細(xì)的內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-08-08
  • Python OpenCV調(diào)用攝像頭檢測(cè)人臉并截圖

    Python OpenCV調(diào)用攝像頭檢測(cè)人臉并截圖

    這篇文章主要為大家詳細(xì)介紹了Python OpenCV調(diào)用攝像頭檢測(cè)人臉并截圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • pytorch使用nn.Moudle實(shí)現(xiàn)邏輯回歸

    pytorch使用nn.Moudle實(shí)現(xiàn)邏輯回歸

    這篇文章主要為大家詳細(xì)介紹了pytorch使用nn.Moudle實(shí)現(xiàn)邏輯回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • python3對(duì)接mysql數(shù)據(jù)庫(kù)實(shí)例詳解

    python3對(duì)接mysql數(shù)據(jù)庫(kù)實(shí)例詳解

    這篇文章主要介紹了python3對(duì)接mysql數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 用Python解決計(jì)數(shù)原理問(wèn)題的方法

    用Python解決計(jì)數(shù)原理問(wèn)題的方法

    計(jì)數(shù)原理是數(shù)學(xué)中的重要研究對(duì)象之一,分類(lèi)加法計(jì)數(shù)原理、分步乘法計(jì)數(shù)原理是解決計(jì)數(shù)問(wèn)題的最基本、最重要的方法,也稱(chēng)為基本計(jì)數(shù)原理,它們?yōu)榻鉀Q很多實(shí)際問(wèn)題提供了思想和工具。本文教大家怎么用Python解決在數(shù)學(xué)中遇到的計(jì)數(shù)原理問(wèn)題。
    2016-08-08
  • Async?IO在Python中的異步編程工作實(shí)例解析

    Async?IO在Python中的異步編程工作實(shí)例解析

    這篇文章主要為大家介紹了Async?IO在Python中的異步編程工作實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Python數(shù)據(jù)分析之繪制m1-m2數(shù)據(jù)

    Python數(shù)據(jù)分析之繪制m1-m2數(shù)據(jù)

    這篇文章主要介紹了Python數(shù)據(jù)分析之繪制m1-m2數(shù)據(jù),文章基于python的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Python?第三方opencv庫(kù)實(shí)現(xiàn)圖像分割處理

    Python?第三方opencv庫(kù)實(shí)現(xiàn)圖像分割處理

    這篇文章主要介紹了Python?第三方opencv庫(kù)實(shí)現(xiàn)圖像分割處理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06

最新評(píng)論

远安县| 岢岚县| 太湖县| 华池县| 白山市| 新民市| 翁牛特旗| 宁明县| 尤溪县| 青冈县| 紫金县| 兰西县| 祁门县| 屏边| 景德镇市| 海南省| 桂平市| 新竹市| 屯门区| 新干县| 剑河县| 旬阳县| 尤溪县| 四川省| 龙游县| 七台河市| 旬阳县| 济源市| 曲沃县| 芮城县| 深水埗区| 合山市| 东明县| 定襄县| 泰和县| 申扎县| 米泉市| 高碑店市| 革吉县| 天津市| 威信县|