zoukankan      html  css  js  c++  java
  • 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型

  • 相关阅读:
    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
    jQuery UI组件库Kendo UI使用技巧小分享
    Kendo UI ListView模板功能,让Web开发更轻松
    UI组件套包DevExpress ASP.NET Core v20.2新版亮点:全新的查询生成器
    Devexpress WinForms最新版开发.NET环境配置Visual Studo和SQL Server对应版本
    全新的桌面应用数据可视化呈现方式,Sankey Diagram控件你了解多少?
    java中的递归方法
    连接数据库查询 将查询结果写入exce文件中
    java连接mysql数据查询数据
  • 原文地址:https://www.cnblogs.com/watertaro/p/10554272.html
Copyright © 2011-2022 走看看