• 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:PycharmProjectsuntitledMyTestProjectMyLearnconfig.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:Python37libconfigparser.py", line 1197, in set
        self._validate_value_types(option=option, value=value)
      File "D:Python37libconfigparser.py", line 1182, in _validate_value_types
        raise TypeError("option values must be strings")
    TypeError: option values must be strings
    D:PycharmProjectsuntitledMyTestProjectMyLearnconfig.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:PycharmProjectsuntitledMyTestProjectMyLearnconfig.ini
    9900 #hello

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

    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:PycharmProjectsuntitledMyTestProjectMyLearnconfig.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:Python37libconfigparser.py", line 696, in read
    D:PycharmProjectsuntitledMyTestProjectMyLearnconfig.ini
        self._read(fp, filename)
      File "D:Python37libconfigparser.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:PycharmProjectsuntitledMyTestProjectMyLearnconfig.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:PycharmProjectsuntitledMyTestProjectMyLearnconfig.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:PycharmProjectsuntitledMyTestProjectMyLearnconfig.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:PycharmProjectsuntitledMyTestProjectMyLearnconfig.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:PycharmProjectsuntitledMyTestProjectMyLearnconfig.ini
    <class 'str'>
    <class 'int'>
    9900

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

  • 相关阅读:
    进程的挂起及恢复
    移植 iconv
    产生不重复随机数
    Javascript数据验证类
    简单设置让EasyUI显示中文,日期选择框格式为yyyyMMdd格式
    NPOI开源组件(操作Execl)创建Workbook和Sheet,创建单元格,设置行列样式等
    PL/SQL中流程控制语句 和Oracle临时表
    c#字符串中包含的运算符按正常计算 例如按四则运算等,类似公式计算,很好很强大
    判断一个数组中的值是否包含在另一个数组中
    利用NPOI开源的读写Excel、WORD等微软OLE2组件读写execl,控制样式或单元格
  • 原文地址:https://www.cnblogs.com/watertaro/p/10554272.html
Copyright © 2020-2023  润新知