1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 4764字,需瀏覽 10分鐘

         ·

        2020-11-19 23:35

        簡(jiǎn)介

        開(kāi)發(fā)人員每天都在處理一些大型而復(fù)雜的項(xiàng)目, 而配置文件會(huì)幫到我們并節(jié)省不少時(shí)間。在處理配置文件過(guò)程中,無(wú)需更改源代碼本身,只需要調(diào)整配置文件即可訪(fǎng)問(wèn)不同的API接口、更新基礎(chǔ)URL信息或其它事情。

        盡管可以通過(guò)多種方式來(lái)支持軟件中的配置文件,包括JSON,YAML和純文本文件,但本文旨在向您介紹 Python 標(biāo)準(zhǔn)庫(kù)中的configparser模塊。

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

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

        在編寫(xiě)代碼之前,讓我們看一下實(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)。

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

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

        訪(fǎng)問(wè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類(lèi),并創(chuàng)建該類(lèi)的實(shí)例。

        #?parser_playground.py
        from?configparser?import?ConfigParser

        config?=?ConfigParser()

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

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

        讀取配置文件后,我們可以開(kāi)始探索如何訪(fǎng)問(wèn)其中存儲(chǔ)的信息。首先,我們要列出所有可用的部分。這可以通過(guò)使用ConfigParsersections()方法來(lái)實(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)模塊·,也沒(méi)有被has_section()方法確認(rèn)。

        接下來(lái),我們要訪(fǎng)問(wèn)各個(gè)值。但是在使用其標(biāo)識(shí)符訪(fǎng)問(wèn)特定值之前,我們可以使用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()方法來(lái)檢查給定部分是否包含某個(gè)選項(xiàng):

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

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

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

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

        如何修改信息

        接下來(lái),讓我們看一下如何添加或更改信息并將其寫(xiě)回到配置文件中。同樣,我們從模塊開(kāi)始。要添加一個(gè)模塊,我們可以使用ConfigParseradd_section()方法。它接受模塊名稱(chēng)作為字符串,并將相應(yīng)模塊添加到解析器。提供不同的數(shù)據(jù)類(lèi)型會(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ì)象提供了類(lèi)似的操作選項(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")}')

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

        #?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è)插值類(lèi):BasicInterpolationExtendedInterpolation。第一個(gè)只允許重用配置文件中同一模塊中的選項(xiàng),并且其語(yǔ)句不如后一個(gè)類(lèi)的語(yǔ)句漂亮。這就是為什么我們只用ExtendedInterpolation類(lèi)。

        以下代碼段顯示了使用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作為插值類(lèi)型:

        #?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

        概要

        本文不僅學(xué)習(xí)了如何使用初始化文件結(jié)構(gòu)訪(fǎng)問(wèn)文件中的值,還學(xué)習(xí)了如何操作和擴(kuò)展它們。此外,您還了解了configparser的插值功能以及如何根據(jù)需要使用它們。


        往期推薦



        5分鐘完全掌握PyPy


        5?分鐘掌握 Python 中常見(jiàn)的配置文件


        OpenCV人工智能圖像識(shí)別技術(shù)實(shí)操案例


        點(diǎn)擊下方閱讀原文加入社區(qū)會(huì)員




        點(diǎn)贊鼓勵(lì)一下

        瀏覽 72
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美精品中文字幕久久二区 | 床戏一区 | 中文天堂网 | 亚洲国产中文日韩欧美高清不卡顿 | 人妻巨大乳A片一区 | 日韩18成人久久久 | 一级A色情大片 | 国产黄色操逼视频 | 97五月天婷婷 | 久久久黑人 |