溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中怎么利用內(nèi)置模塊處理ini配置文件

發(fā)布時(shí)間:2021-07-10 16:31:23 來源:億速云 閱讀:177 作者:Leah 欄目:編程語(yǔ)言

Python中怎么利用內(nèi)置模塊處理ini配置文件,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

注意:本文基于Python  3.9.0(CPython)??梢栽贕itHub上找到源代碼。(https://github.com/DahlitzFlorian/how-to-work-with-config-files-in-python-article-snippets)

文件結(jié)構(gòu)

在編寫代碼之前,讓我們看一下實(shí)際配置文件的結(jié)構(gòu)。

[DEFAULT] admin_page = no landing_page = yes moderator_page = no  # looks good here  [moderator] moderator_page = yes  [admin] admin_page = yes moderator_page = yes

在當(dāng)前的示例中,我們有一個(gè)名為config.ini的配置文件。它由三個(gè)部分組成,每個(gè)部分都由一個(gè)標(biāo)題和一個(gè)鍵-值對(duì)列表組成,該標(biāo)題封裝在方括號(hào)內(nèi)。

moderator和admin模塊只是鍵值對(duì)的集合,但DEFAULT模塊(第一個(gè)模塊)有些特殊。如果其他模塊之一未提供某個(gè)鍵的值,則它就會(huì)包含默認(rèn)值。因此,如果您想嘗試訪問其他模塊中的值,但該鍵不存在,則解析器將從默認(rèn)部分(如果存在)中返回該值,而不是引發(fā)KeyError。

在本例中,我們通過此配置文件管理用戶的頁(yè)面訪問。因此,默認(rèn)部分代表普通用戶的權(quán)限,而moderator和admin模塊分別包含協(xié)管員和管理員的權(quán)限。

訪問文件的內(nèi)容

ConfigParser對(duì)象是主要的配置解析器和configparser模塊的主要對(duì)象。您可以使用映射協(xié)議實(shí)現(xiàn)自己的配置解析器,讓我們繼續(xù)看看本文中的ConfigParser。

盡管ConfigParser接受很多參數(shù),但我們將使用本文的默認(rèn)值。讓我們?cè)诠ぷ髂夸浿袆?chuàng)建一個(gè)名為parser_playground.py的新文件。首先,我們從configparser模塊導(dǎo)入ConfigParser類,并創(chuàng)建該類的實(shí)例。

# parser_playground.py from configparser import ConfigParser  config = ConfigParser()

我們的配置對(duì)象不包含任何信息,  要更改此設(shè)置,我們需要先讀取config.ini文件。這可以通過調(diào)用ConfigParser實(shí)例(此處為config)的read()方法來完成。

# previous code in parser_playground.py config.read("config.ini")

讀取配置文件后,我們可以開始探索如何訪問其中存儲(chǔ)的信息。首先,我們要列出所有可用的部分。這可以通過使用ConfigParser的sections()方法來實(shí)現(xiàn):

# previous code in parser_playground.py print(f"Sections: {config.sections()}")  # Sections: ['moderator', 'admin']

此外,我們可以使用解析器的has_section()方法檢查某個(gè)模塊是否存在:

# previous code in parser_playground.py print(f'Does a section called "admin" exist: {config.has_section("admin")}')  # True print(f'Does a section called "user" exist: {config.has_section("user")}')  # False print(f'Does a section called "DEFAULT" exist: {config.has_section("DEFAULT")}')  # False

注意:調(diào)用sections()方法時(shí),既未列出默認(rèn)模塊·,也沒有被has_section()方法確認(rèn)。

接下來,我們要訪問各個(gè)值。但是在使用其標(biāo)識(shí)符訪問特定值之前,我們可以使用options()方法列出一個(gè)模塊的所有可用選項(xiàng),并提供模塊名作為參數(shù):

# Previous code in parser_playground.py print(f'Options: {config.options("admin")}')  # Options: ['admin_page', 'moderator_page', 'landing_page']

此外,我們可以利用has_option()方法來檢查給定部分是否包含某個(gè)選項(xiàng):

# Previous code in parser_playground.py print(f'"admin_page" in "admin" section: {config.has_option("admin", "admin_page")}')

要訪問模塊的值,可以使用解析器的get()方法并提供區(qū)域名稱和選項(xiàng)名稱。這些值將始終為字符串(如果存在)。如果需要其他格式的文件,請(qǐng)考慮使用相應(yīng)的getboolean(),getint()和getfloat()方法。他們將嘗試將字符串解析為所需的數(shù)據(jù)類型。

總結(jié)本節(jié)內(nèi)容時(shí)有個(gè)概念需要提到,它就是映射協(xié)議訪問。這個(gè)通用名稱意味著可以像處理字典一樣訪問值。也就是說,我們可以使用config [“  section”] [“ option”]類似的方法來訪問某個(gè)值,甚至檢查某個(gè)模塊中是否存在某個(gè)選項(xiàng):

# Previous code in parser_playground.py print("admin_page" in config["admin"])  # True print(config["admin"]["admin_page"])  # yes

如何修改信息

接下來,讓我們看一下如何添加或更改信息并將其寫回到配置文件中。同樣,我們從模塊開始。要添加一個(gè)模塊,我們可以使用ConfigParser的add_section()方法。它接受模塊名稱作為字符串,并將相應(yīng)模塊添加到解析器。提供不同的數(shù)據(jù)類型會(huì)導(dǎo)致TypeError。如果該模塊已經(jīng)存在,則會(huì)引發(fā)DuplicateSectionError。嘗試將該模塊命名為默認(rèn)值會(huì)導(dǎo)致ValueError。

# Previous code in parser_playground.py config.add_section("unknown") print(f'Sections: {config.sections()}')  # Sections: ['moderator', 'admin', 'unknown']

要?jiǎng)h除一個(gè)模塊,只需使用remove_section()方法。

# Previous code in parser_playground.py config.remove_section("unknown") print(f'Sections: {config.sections()}')  # Sections: ['moderator', 'admin']

Python的ConfigParser對(duì)象提供了類似的操作選項(xiàng)的方法。例如,調(diào)用set()方法,不僅可以向模塊添加新選項(xiàng),還可以更新現(xiàn)有選項(xiàng)。同樣,如果您想完全刪除某個(gè)選項(xiàng),請(qǐng)使用解析器的remove_option()方法。

# Previous code in parser_playground.py config.set("admin", "admin_page", "false") config.remove_option("admin", "moderator_page") print(f'Options in "admin" section: {config.items("admin")}')

處理完配置后,我們可以將其寫回到相同或不同的文件,如下所示:

# Previous code in parser_playground.py with open("config1.ini", "w") as f:     config.write(f)

插值

最后但也很重要的一點(diǎn),讓我們看一下使ConfigParser優(yōu)于Python的json模塊的東西:插值。插值意味著可以在調(diào)用某些get()方法返回值之前對(duì)其進(jìn)行預(yù)處理。configparser模塊提供兩個(gè)插值類:BasicInterpolation和ExtendedInterpolation。第一個(gè)只允許重用配置文件中同一模塊中的選項(xiàng),并且其語(yǔ)句不如后一個(gè)類的語(yǔ)句漂亮。這就是為什么我們只用ExtendedInterpolation類。

以下代碼段顯示了使用Extended Interpolation語(yǔ)句的配置文件。

# interpolation_config.ini [paths] root_dir = /home/florian downloads_dir = ${root_dir}/Downloads  [destinations] app_dir = ${paths:downloads_dir}/application/python

本質(zhì)上,第一個(gè)模塊定義了根目錄的路徑。該路徑用作第二個(gè)選項(xiàng)的前綴,即下載目錄的路徑。在第二個(gè)模塊中,我們有一個(gè)選項(xiàng)app_dir,它重用了pahts模塊中對(duì)downloads目錄的定義。

為了掌握這一點(diǎn),我們?cè)趯?shí)例化解析器時(shí)讓ConfigParser使用ExtendedInterpolation作為插值類型:

# interpolation.py from configparser import ConfigParser from configparser import ExtendedInterpolation  config = ConfigParser(interpolation=ExtendedInterpolation()) config.read("interpolation_config.ini")

如果現(xiàn)在打印destinations模塊的app_dir選項(xiàng)的值,則會(huì)得到一個(gè)插值字符串。

# Previous code in interpolation.py print(config.get("destinations", "app_dir"))
$ python interpolation.py /home/florian/Downloads/application/python

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI