2015-05-20 17 views
1

this question中,OP想要使用ConfigParser從配置文件中提取未知數量的節,其中所有節都共享相同的內部格式。如何使用ConfigParser提取未知數量的值對?

在我的情況下,我不得不將所有內容都限制在一個部分。我試圖找出一個可維護,理智的方法來存儲「對」數據。一個人爲的例子將解釋事情變得更好:

[pings] 
host1 = foo.com 
port1 = 80 
interval1 = 60 
host2 = bar.com 
port2 = 8080 
interval2 = 300 
host3 = baz.com 
port3 = 443 
interval3 = 15 

這將是一個遞增指數環被讀取,而一旦我們到達那裏沒有找到預期值的迭代,我們可以推測,我們已經達到了目的的數據並停止。問題是這是醜陋的,不可維護的,更糟糕​​的是,假設我們想要註釋掉host1 ......我們必須重新編號列表中的所有其他內容,以防止掃描早日終止。

這不打我作爲好得多:

[pings] 
hosts = foo.com, bar.com, baz.com 
ports = 80, 8080, 443 
intervals = 60, 300, 15 

太難閱讀項目的任何顯著數量,脆弱編輯等

我可以轉動它:

[pings] 
ping1 = foo.com, 80, 60 
ping2 = bar.com, 8080, 300 
ping3 = baz.com, 443, 15 

稍微按邏輯分組,但如果項目被添加/刪除/重新排列,仍然存在行重新編號問題。也很容易迷路(想想可以掃描一個非常寬的CSV表格)。

我想避免嵌入JSON或任何形式的對象文字符號。編輯錯誤的機會太多,無法解析解析器。

很久以前,我記得使用PHP在哪裏可以添加可變數量的查詢字符串項目,如?host[]=foo.com&host[]=bar.com&host[]=baz.com$_GET['host'] global將成爲一個包含三個項目的數組。盜取語法,我可以這樣做:

[pings] 
host[] = foo.com 
port[] = 80 
interval[] = 60 

host[] = bar.com 
port[] = 8080 
interval[] = 300 

host[] = baz.com 
port[] = 443 
interval[] = 15 

...或:

[pings] 
ping[] = foo.com, 80, 60 
ping[] = bar.com, 8080, 300 
ping[] = baz.com, 443, 15 

...並會有少一點擔心添加/刪除項目時。但我相信ConfigParser實際上會發生什麼是最新的項目(或者是最早的項目?)會覆蓋其他項目......如果[]甚至被接受爲配置項。

是否有任何已建立的最佳實踐在配置文件中表達這樣的事情?

+1

爲什麼限制只有一個部分?對於這個問題,在我看來,像JSON或YAML將是比INI文件更好的文件格式。 – Waylan

+0

除非外部要求強制您使用INI文件,否則另一種格式將更容易使用。 – chepner

回答

0

沒有測試它,我會寫這樣的:

config = ConfigParser.ConfigParser() 

with open('path/to/file.ini') as config_f: 
    config.readfp(config_f) 
    # config.readfile in 3.2+ 

configitems = config.section('pings') 

ping_infos = [{'host':host, 'port':port, 'interval':interval} for 
       host, port, interval in [value.split()]} for 
       key,value in configitems if key.startswith('ping')] 

然後,你可以寫你的配置文件作爲

[pings] 
; pingANYUNIQUECHAR = hostname, portnumber, interval 
ping-foo.com = foo.com, 80, 60 
ping-bar.com = bar.com, 8080, 300 

你會結了:

ping_infos = [{'host': 'foo.com', 
       'port': '80', 
       'interval': 60}, 
       {'host': 'bar.com', 
       'port': 8080, 
       'interval': 300}] 
相關問題