python之讀取配置文件模塊configparser(二)參數詳解
configparser.ConfigParser參數詳解
從configparser的__ini__中可以看到有如下參數:
def __init__(self, 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):
defaults:設置參數的默認值,這裏參數是對所有section下的相同參數,如果沒有則使用這裏設置的值,如下:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) #增加參數defaults cp = configparser.ConfigParser(defaults = {‘globalmd5‘:‘parametertest‘}) print(cp.defaults()) cp.read(filepath) #刪除前分別讀取password和IP倆個section下globalmd5的值 get_password_globalmd5 = cp.get(‘password‘,‘globalmd5‘) get_IP_minimd5 = cp.get(‘IP‘,‘globalmd5‘) print(‘password_globalmd5:‘,get_password_globalmd5) print(‘IP_globalmd5‘,get_IP_minimd5)#刪除globalmd5參數 cp.remove_option(‘password‘,‘globalmd5‘) #刪除後讀取globalmd5和minimd5的值 get_password_globalmd5 = cp.get(‘password‘,‘globalmd5‘) get_IP_minimd5 = cp.get(‘IP‘,‘globalmd5‘) print(‘password_globalmd5:‘,get_password_globalmd5) print(‘IP_globalmd5‘,get_IP_minimd5)
上述代碼執行結果為:
D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
OrderedDict([(‘globalmd5‘, ‘parametertest‘)])
password_globalmd5: functest
IP_globalmd5 parametertest
password_globalmd5: parametertest
IP_globalmd5 parametertest
可以看到刪除了‘password’節點下的globalmd5後,依然可以獲取defaults中的globalmd5的值
此時config.ini文件中會存在default節點,option則為設置的默認globalmd5
dict_type:字典類型,默認為OrderedDict
allow_no_value:是否允許option的值為空,默認為False,即不允許為空,若為空則報錯,如下代碼為option設置為空情況:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser() print(cp.defaults()) cp.read(filepath) #設置option值為空 cp.set(‘IP‘,‘url‘) with open(filepath,‘w+‘) as f: cp.write(f)
運行代碼後報錯信息如下:
Traceback (most recent call last): File "D:/PycharmProjects/untitled/MyTestProject/MyLearn/temp.py", line 11, in <module> cp.set(‘IP‘,‘url‘) File "D:\Python37\lib\configparser.py", line 1197, in set self._validate_value_types(option=option, value=value) File "D:\Python37\lib\configparser.py", line 1182, in _validate_value_types raise TypeError("option values must be strings") TypeError: option values must be strings D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
倒數第二行清楚寫了option的值必須為str類型。
如果把allow_no_value的值修改為True,代碼如下:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) #修改allow_no_value值為True cp = configparser.ConfigParser(allow_no_value = True) cp.read(filepath) #設置option值為空 cp.set(‘IP‘,‘url‘) with open(filepath,‘w+‘) as f: cp.write(f)
則不會報錯,查看config.ini文件發現多加了一行url,但沒有值:
[password] globalmd5 = functest [IP] port = 9900 address = http://sdv.functest.com url
delimiters:分隔符,即參數和值之間的分隔符,默認為冒號(:)和等號(=),也可以自定義分隔符,如下所示,修改config.ini中使用大於號(>)作為分隔符:
[password] globalmd5 > functest [IP] port > 9900 address > http://sdv.functest.com
修改代碼使用(>)作為分隔符來操作:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) #修改分隔符為> cp = configparser.ConfigParser(delimiters = (‘>‘)) cp.read(filepath) get_port = cp.get(‘IP‘,‘port‘) print(get_port)
執行代碼可以打印正確的值
comment_prefixes:註釋前綴,默認為井號(#)或分號(;),可以自己修改,如果分設定的前綴會報錯
inline_comment_prefixes:非空行後的註釋前綴,默認是沒有的,如若確實需要可以添加,修改config.ini文件如下:
[password] #hello globalmd5 = functest [IP] port = 9900 #hello address = http://sdv.functest.com
若不設置inline_comment_prefixes,則port後面的#hello是最為port的值的,如下代碼:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser() cp.read(filepath) get_port = cp.get(‘IP‘,‘port‘) print(get_port)
代碼執行結果如下:
D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
9900 #hello
若我們把#設置為行內註釋符,name就顯示正確了:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) #修改行內分隔符為# cp = configparser.ConfigParser(inline_comment_prefixes = ‘#‘) cp.read(filepath) get_port = cp.get(‘IP‘,‘port‘) print(get_port)
上述代碼執行結果如下:
D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
9900
strict:是否允許單一配置文件中有相同的section或同一section中有相同option,默認為True,不允許。修改config.ini文件復制globalmd5項並修改值如下:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser() cp.read(filepath) get_globalmd5 = cp.get(‘password‘,‘globalmd5‘) print(get_globalmd5)
可以看到執行報錯了:
Traceback (most recent call last): File "D:/PycharmProjects/untitled/MyTestProject/MyLearn/temp.py", line 8, in <module> cp.read(filepath) File "D:\Python37\lib\configparser.py", line 696, in read D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini self._read(fp, filename) File "D:\Python37\lib\configparser.py", line 1091, in _read fpname, lineno) configparser.DuplicateOptionError: While reading from ‘D:\\PycharmProjects\\untitled\\MyTestProject\\MyLearn\\config.ini‘ [line 3]: option ‘globalmd5‘ in section ‘password‘ already exists
最後報錯信息時globalmd5重復了,修改strict為False,如下代碼:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser(strict = False) cp.read(filepath) get_globalmd5 = cp.get(‘password‘,‘globalmd5‘) print(get_globalmd5)
執行結果為:
D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
functest2
使用的是後一個globalmd5的值
empty_lines_in_values:option的值是否允許有空行,默認為True,允許有空行。修改config.ini文件如下:
[password] globalmd5 = functest [IP] port = 9900 address = http://sdv.fu nctest.com
此時使用如下代碼查詢address的值是OK的:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser() cp.read(filepath) get_address = cp.get(‘IP‘,‘address‘) print(get_address)
若修改empty_lines_in_values為False,則會報錯:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser(empty_lines_in_values = False) cp.read(filepath) get_address = cp.get(‘IP‘,‘address‘) print(get_address)
default_section:默認section,默認的節點為‘default’,也可以指定為存在的section,如下代碼可以證明:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser(default_section = ‘IP‘) cp.read(filepath) print(cp.defaults())
上述代碼執行結果為:
D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
OrderedDict([(‘port‘, ‘9900‘), (‘address‘, ‘http://sdv.functest.com‘)])
打印的是IP這個section下面option的鍵值對
interpolation:插值,默認值為_UNSET,支持section插值,不支持跨section插值,修改config.ini文件如下:
[password] globalmd5 = functest [IP] port = 9900 address = http://sdv.functest.com:%(port)s
此時可以使用如下代碼查詢address的值:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser() cp.read(filepath) get_address = cp.get(‘IP‘,‘address‘) print(get_address)
執行結果如下:
D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
http://sdv.functest.com:9900
configparser自動把%(port)s解釋為同section下port的值
如果需要跨section引用數據,需要使用ExtendedInterpolation這個子類,當然使用方法稍微不同,修改config.ini文件如下:
[password] globalmd5 = functest [IP] port = 9900 address = http://sdv.${password:globalmd5}.com port_test = ${port}
使用如下代碼分別查詢port_test和address的值:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) cp = configparser.ConfigParser(interpolation = configparser.ExtendedInterpolation()) cp.read(filepath) get_port = cp.get(‘IP‘,‘port_test‘) get_address = cp.get(‘IP‘,‘address‘) print(get_port) print(get_address)
執行結果如下:
D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
9900
http://sdv.functest.com
這樣就比較靈活的來配置文件了
但是不建議使用,因為和基礎類的使用方法不一樣,容易出錯
converters:添加一個轉換類型,同getint或getfloat。其值為一個字典類型,鍵為get*(),值為可調用的,比如getint也可以這樣自定義:
import configparser import os filepath = os.path.join(os.getcwd(),‘config.ini‘) print(filepath) #設置converters值為int轉換 cp = configparser.ConfigParser(converters = {‘toint‘:int}) cp.read(filepath) get_port = cp.get(‘IP‘,‘port‘) print(type(get_port)) get_port = cp.gettoint(‘IP‘,‘port‘) print(type(get_port)) print(get_port)
上述代碼執行結果如下:
D:\PycharmProjects\untitled\MyTestProject\MyLearn\config.ini
<class ‘str‘>
<class ‘int‘>
9900
可以看到,默認get到的是一個str類型,通過自定義的轉換函數gettoint(),轉換為了int型
python之讀取配置文件模塊configparser(二)參數詳解