python如何调用参数配置文件_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下的相同参数,如果没有则使用这里设置的值,如下:

importconfigparserimportos

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设置为空情况:

importconfigparserimportos

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 cp.set('IP','url')

File"D:\Python37\lib\configparser.py", line 1197, inset

self._validate_value_types(option=option, value=value)

File"D:\Python37\lib\configparser.py", line 1182, in_validate_value_typesraise 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,代码如下:

importconfigparserimportos

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= 9900address=http://sdv.functest.com

url

delimiters:分隔符,即参数和值之间的分隔符,默认为冒号(:)和等号(=),也可以自定义分隔符,如下所示,修改config.ini中使用大于号(>)作为分隔符:

[password]globalmd5 > functest[IP]port >9900address > http://sdv.functest.com

修改代码使用(>)作为分隔符来操作:

importconfigparserimportos

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的值的,如下代码:

importconfigparserimportos

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

若我们把#设置为行内注释符,那么就显示正确了:

importconfigparserimportos

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项并修改值如下:

importconfigparserimportos

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 cp.read(filepath)

File"D:\Python37\lib\configparser.py", line 696, inread

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 readingfrom 'D:\\PycharmProjects\\untitled\\MyTestProject\\MyLearn\\config.ini' [line 3]: option 'globalmd5' in section 'password' already exists

最后报错信息时globalmd5重复了,修改strict为False,如下代码:

importconfigparserimportos

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= 9900address=http://sdv.fu

nctest.com

此时使用如下代码查询address的值是OK的:

importconfigparserimportos

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,则会报错:

importconfigparserimportos

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,如下代码可以证明:

importconfigparserimportos

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= 9900address= http://sdv.functest.com:%(port)s

此时可以使用如下代码查询address的值:

importconfigparserimportos

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= 9900address=http://sdv.${password:globalmd5}.com

port_test= ${port}

使用如下代码分别查询port_test和address的值:

importconfigparserimportos

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

9900http://sdv.functest.com

这样就比较灵活的来配置文件了

但是不建议使用,因为和基础类的使用方法不一样,容易出错

converters:添加一个转换类型,同getint或getfloat。其值为一个字典类型,键为get*(),值为可调用的,比如getint也可以这样自定义:

importconfigparserimportos

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

9900

可以看到,默认get到的是一个str类型,通过自定义的转换函数gettoint(),转换为了int型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值