在平時的開發中感受INI格式的配置文件使用仍是挺須要的,有時會使用一個單獨的py來存放一些常量或者配置項,大多時候這樣卻是挺好用的,可是若是某些配置項須要在運行時由用戶來修改指定,好比不少app在關閉時會有一個彈出框提示「是否關閉」和「下次再也不提醒」,這種配置項若是使用INI格式的配置文件來操做的話就會方便不少,Python中操做配置文件的模塊爲configparser,這個模塊能夠用來解析與Windows上INI文件結構相似的文件。html
官方文檔:https://docs.python.org/3/library/configparser.htmlpython
看官方文檔的時候發現不一樣Python版本之間某些API仍是有些小區別的,因此先說一下,本文使用的是Python3.6。web
一個普通的INI配置文件cfg.ini示例以下:正則表達式
; DEFAULT爲默認section,當獲取其餘section中同名option,而該section又沒有這個option時,會取DEFAULT中的該option
[DEFAULT]
close_prompt = yes
[baidu]
website = www.baidu.com
# 本機信息 [home]
ip = 127.0.0.1
port = 8080
INI配置文件組成:app
- section:表示一個區塊,由方括號及方括號中的名稱組成,section的範圍爲當前方括號到下一個方括號的內容,如「DEFAULT」,「baidu」,「home」。
- 大小寫和空格檢查:section中的名稱在保存和獲取的時候是原樣保存和獲取的,即大小寫不同或者空格不同等都是不一樣的section;
- 重複性檢查:同一個配置文件中section名稱是不容許重複的。
- option:表示section中的配置項,由key、分隔符和value組成的鍵值對,如「home」下的「port=8080」。
- 大小寫檢查:key是大小寫不敏感的,保存進文件的時候會自動將key小寫保存,但value是大小寫敏感的;
- 空格檢查:經過key獲取value時,會自動將文件中的key和value先後空格去掉再進行匹配,即文件中保存爲' ip = 127.0.0.1 '時,用'ip'也能夠獲取到對應的value值'127.0.0.1';
- 跨多行檢查:key是不能跨行的,可是value能夠跨行,只要第二行即以後的行的縮進與第一行不一樣便可,一直到下一個option爲止;
- 重複性檢查:和section同樣,同一section下的key是不容許重複的;
- 分隔符:能夠是等號「=」或者冒號「:」。
- 註釋:行註釋用井號「#」或者分號「;」表示,特別須要注意的是必須得是行開頭(前面能夠有空格),用在行中間的就不會算做是註釋了。
- DEFAULT:這是一個特殊的section,會用做其餘section的option取不到值時的備用值,或者能夠理解爲它是一個root,其餘的section都是它的子section,但不是必須提供的。
向配置文件中寫數據:函數
# -*- coding:utf-8 -*-
from configparser import ConfigParser
# 使用字典的方式給配置對象添加配置信息
config = ConfigParser()
config['DEFAULT'] = {
'close_prompt': 'yes',
}
config['baidu'] = {}
config['baidu']['website'] = 'www.baidu.com'
config['home'] = {}
home = config['home']
home['ip'] = '127.0.0.1'
home['port'] = '8080'
# 將配置信息寫入文件
with open('cfg.ini', 'w') as cfg_file:
config.write(cfg_file)
從配置文件中讀取數據:性能
# -*- coding:utf-8 -*-
from configparser import ConfigParser
# 以字典的方式讀取配置對象中的數據
config = ConfigParser()
print(config.sections()) # 輸出:[]
# 從配置文件中讀取數據,若是配置文件中有中文信息,注意編碼
config.read('cfg.ini', encoding='utf-8')
print(config.sections()) # 輸出:['baidu', 'home']
print('baidu' in config) # 輸出:True
print(config['baidu']['website']) # 輸出:www.baidu.com
home = config['home']
print(home['ip']) # 輸出:127.0.0.1
for key in home:
print(key) # 依次輸出:ip,port,close_prompt
configparser.ConfigParser編碼
從上面的例子能夠看出ConfigParser實例能夠像操做字典同樣去操做它,每一個section對應一個由key/value組成的option字典,雖然能夠經過添加和設置section和option等方法來操做,但仍是推薦使用字典的方式,可讀性也要強一點。其實還有另外一個解析類RawConfigParser,與ConfigParser的區別在於前者不容許進行字符串的格式化,並且後者也是繼承自前者的,因此這裏就只講ConfigParser。(至於還有一個SafeConfigParser,在Python3.2以後就合道ConfigParser中,跟RawConfigParser和ConfigParser的區別在於能夠跨section進行字符串的格式化,這裏也不講了)spa
初始化方法:ConfigParser(defaults=None, dict_type=_default_dict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=DEFAULTSECT, interpolation=_UNSET, converters=_UNSET):code
- defaults:設置配置文件中名爲DEFAULT的默認section信息,默認爲None,能夠傳入一個包含option信息的字典;
- dict_type:設置讀取配置信息時的字典類型,默認爲有序字典,即collections.OrderedDict,若是實在要考慮性能等緣由,可使用python默認字典dict;
- allow_no_value:是否容許key沒有對應的value,默認爲False,若是加載的配置文件中有這種狀況,須要手動設置爲True;
- delimiters:設置分隔符,默認爲「=」和「:」,且一個option中第二個及以後的分隔符會算做value的一部分;
- comment_prefixes:設置註釋符,默認爲「#」和「;」,即一行的開頭(取出空格後)爲「#」或者「;」,則這一行算做註釋內容,包括value有多行的狀況也是如此;
- inline_comment_prefixes:設置行中的註釋前綴,即一行中這個符號以後的內容被認爲是註釋;
- strict:默認爲True,即讀取配置數據時不容許出現重複的section和option;
- empty_lines_in_values:是否容許value中出現空行,默認爲True,若是設置爲False,則value中的空行將做爲這個option的結束標誌;
- default_section:更改默認的section名稱,本來默認的section是DEFAULT(注意更改操做須要在實例化以後,讀取數據以前);
- interpolation:設置value的字符串格式化功能,若是不想使用value的字符串格式化功能,能夠設置None;
- converters:設置將value轉換爲特定類型的數據,參數值爲一個字典,字典的key爲轉換方法的名稱,value爲對應的轉換函數,提供這個字典後,會自動生成對應的get/set方法,好比提供一個字典{'int': int}就會生成getint轉換方法(固然這個方法已經內置有了,這裏只是舉個例子)。
value字符串格式化:可使用%(name)s進行字符串的格式化,且name只能是本section和DEFAULT中的option項。
自定義option的key配置方式:如本來是key是自動轉化爲小寫的,如今設置其區分大小寫:parser.optionxform = lambda option: option(注意更改操做須要在實例化以後,讀取數據以前)。
自定義section自定義配置方式:如本來section是包含了空格以及大小寫區分的,如今利用正則表達式設置其去掉首位的空格:parser.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")(注意更改操做須要在實例化以後,讀取數據以前)。
經常使用方法:
- defaults():以字典的方式返回默認的section,即DEFAULT;
- sections():返回section名稱的列表,可是不包括DEFAULT;
- add_section(section):添加一個section,字符串類型,且已經存在的section不能再往裏添加;
- has_section(section):判斷當前配置中是否有此section,DEFAULT不包含在此判斷中;
- options(section):返回此section下的option列表;
- has_option(section, option):若是指定的section存在,且包含該option,則返回True,不然返回False;若是傳入的section爲None或者空字符串,則使用DEFAULT這個section進行查找判斷;
- read(filenames, encoding=None):能夠傳入單個文件,或者多個文件的列表,若是多個文件中某個文件沒法打開,則這個文件會被忽略;
- read_file(f, source=None):從一個文件流(不是文件名稱)讀取配置,source爲文件流的名稱;
- read_string(string, source='<string>'):從一個字符串讀取配置,source爲字符串的名稱;
- read_dict(dictionary, source='<dict>'):從一個類字典對象中讀取配置信息,source爲類字典對象的名稱;
- get(section, option, *, raw=False, vars=None[, fallback]):獲取section下指定option的值,若是vars被提供了(必須是一個字典),則按照vars、section、DEFAULT這個順序進行查找。raw指定爲True時,option中value值不會自動進行格式化字符串的轉換,直接返回原內容。fallback用於指定當查找的option沒有時返回的默認值;
- getint(section, option, *, raw=False, vars=None[, fallback]):將get的值強轉成int類型(raw、vars和fallback參數請參考get方法);
- getfloat(section, option, *, raw=Fasle, vars=None[, ballback]):將get的值強轉成float類型(raw、vars和fallback參數請參考get方法);
- getboolean(section, option, *, raw=False, vars=None[, fallback]):將get的值強轉成boolean類型True或False,轉換原則爲yes/no、on/off、true/false和1/0能夠轉換爲True和False,其餘項則會報錯(raw、vars和fallback參數請參考get方法)。若是想要自定義轉換爲True或False的項,能夠經過設置parser.BOOLEAN_STATES來定指定,如:parser.BOOLEAN_STATES = {'open': True, 'close': False},可是這時候意味着沒在這個字典中的項就會報錯了,包括原來的yes/no等項;
- items((raw=False, vars=None):返回section的迭代器,包括DEFAULT(raw和vars參數請參考get方法);
- items(section, raw=False, vars=None):返回指定section下option鍵值對元組的列表(raw和vars參數請參考get方法);
- set(section, option, value):給指定的section設置一個option鍵值對;
- write(fileobject, space_around_delimiters=True):將配置信息寫進一個open的文件對象,space_around_delimiters爲True時,option的分隔符兩邊會有空格;
- remove_option(section, option):移除指定section下的指定option,成功返回True,不然返回False;
- remove_section(section):移除一個section,若是存在且移除成功,則返回True,不然返回False。