[Python] ConfigParser

常常跑個程式, 需要相當多不同的設定實在有夠麻煩, 就用個ini file來幫忙, python就有個ConfigParser可以處理

ConfigParser - Configuration file parser : http://docs.python.org/2/library/configparser.html

使用上相當簡單, 不過要是看官網, 會發現, 疑, 他有好多個ConfigParser, 在很久之前我用過基本的RawConfigParser, 後來新版本出來後, 基本都是使用SafeConfigParser, 依照官網說法, 為了compatible的問題, 當然還有增加一些額外的方法, 不過這我就沒有真的去測試了


舉例來說設定過ini的人應該了解ini file的格式

env.cfg

[Daemon]
IP = 192.168.1.5
PORT = 54321

[DTree]
LEAF = 1
INFOGAIN = 0.1

Ex:
import ConfigParser
config = ConfigParser.SafeConfigParser()
config.read("env.cfg")

sip = config.get('Daemon', 'IP')
sport = config.getint('Daemon', 'PORT')


可以看的出來, 用read讀入ini檔案. 每一個開頭都叫做section, 裡面的稱為property

然後用get取出property, get後面要先放section name, 再放要擷取的property name, 就會取出property value. 要注意的是, get預設出來是str type, 基本上它還有getint, getfloat, getboolean

上面是相當簡易的使用方式, 那我們來看使用更完整的資訊

如果今天config檔案很大, 很複雜, 你想要用ConfigParser顯示出更多的資訊, 可以這樣做

Ex:
import ConfigParser
config = ConfigParser.SafeConfigParser()
config.read(filepath)

print 'Sections:'
print config.sections()
print 'Properties:'
for name in config.sections():
    print config.options(name)


所有的section可以呼叫sections(), 會傳出一個list涵蓋所有section name, 知道section之後, 還可以透過options()去呼叫出所有可能的property name

Output Result:
Sections:
['DTree', 'Daemon']
Properties:
['leaf', 'infogain']
['port', 'ip']

那如果, 我現在要修改ini設定值跟刪除某個設定, 並且寫回ini file, 可以這麼做

config.set('Daemon', 'IP', '192.168.1.2')  # 只有設定, 檔案並不會修改, 
config.remove_option('DTree', 'LEAF') #可以修改, 當然也可以刪除
config.write(open("env.cfg", "w")) # 這樣檔案才真的會修改

這邊實驗過的人會發現一個很討厭的事情, property居然都變成小寫了!! 其實只要在宣告ConfigParser之後多一行設定即可, 預設讀入ini的時候其實是全部小寫, 官網有特別說明

config = ConfigParser.SafeConfigParser()
config.optionxform = str # 多加這行
config.read("env.cfg")

這樣, 就可以原模原樣的繼續使用了!!

ref: http://docs.python.org/2/library/configparser.html#ConfigParser.RawConfigParser.optionxform

wiki ini file format: http://en.wikipedia.org/wiki/INI_file

留言

這個網誌中的熱門文章

[Linux] Linux下查詢硬體記憶體資訊 Memory Information

[Other] Chrome 重新整理所有開啟頁面

[Python] Simple Socket Server