1. 程式人生 > >python之讀取配置文件模塊configparser(二)參數詳解

python之讀取配置文件模塊configparser(二)參數詳解

string cts open mod fix error: 註釋 大於 default

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(二)參數詳解