python模块之configparse

发布时间:2019-09-16 07:39:23编辑:auto阅读(1805)

    configparser

    configParser 模块用于操作配置文件

    注:Parser汉译为“解析”之意。

    配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值或者键:值)。

    为了更好的理解本文,我们先了解一下配置文件的组成及命名:配置文件(INI文件)由节(section)、键、值组成。

    样例配置文件config.ini

    [book]
    title = ConfigParser模块教程
    time = 2018-01-12 11:47:37
    
    [size]
    size = 1024
    
    [other]
    blog = https://blog.51cto.com/kexiaoke

    在config.ini里面出现了三个节(section),分别是book,size,other
    book里面有两个键值对,size和other里面各一个。

    读取配置文件

    • read(filename) 直接读取ini文件内容
    • sections() 得到所有的section,并以列表的形式返回
    • options(section) 得到该section的所有option
    • items(section) 得到该section的所有键值对
    • get(section,option) 得到section中option的值,返回为string类型
    • getint(section,option) 得到section中option的值,返回为int类型

    增加或修改配置

    • add_section(section) 添加一个新的section
    • set( section, option, value) 对section中的option进行设置
      需要调用write将内容写入配置文件。

      获取config.ini配置示例

      read_config.py

    #!/usr/bin/env python

    -- coding: utf-8 --

    __author__ = 'xiaoke'
    __time__ = '2018-01-12 11:17'
    PROJECT_NAME = 'test_projtcts'
    
    #导入configparser模块
    import configparser
    
    #生成conf对象
    conf= configparser.ConfigParser()
    
    #加载config.ini文件内容
    conf.read('config.ini')
    
    #读取配置文件里所有的Section
    print('读取配置文件里所有的Section')
    print(conf.sections())
    
    #打印出book这个section下包含key
    print('打印出book这个section下包含key')
    print(conf.options('book'))
    
    #打印test1这个section下所有的key及对应的values
    print('打印book这个section下所有的key及对应的values')
    print(conf.items("book"))
    
    #指定section,option读取值
    print('获取book这section个title内容')
    print(conf.get('book','title'))

    执行结果如下

    读取配置文件里所有的Section
    ['book', 'size', 'other']
    打印出book这个section下包含key
    ['title', 'time']
    打印book这个section下所有的key及对应的values
    [('title', 'ConfigParser模块教程'), ('time', '2018-01-12 11:47:37')]
    获取book这section个title内容
    ConfigParser模块教程

    在config.ini文件增加一个section

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    __author__ = 'xiaoke'
    __time__ = '2018-01-12 13:54'
    PROJECT_NAME = 'test_projtcts'
    
    #导入configparser模块
    import configparser
    
    #生成conf对象
    conf= configparser.ConfigParser()
    
    #加载config.ini文件内容
    conf.read('config.ini')
    
    #增加一个section
    conf.add_section('add_test')
    conf.set('add_test','name','xiaoke')
    conf.set('add_test','age','25')
    
    #添加完毕,必须调用write方法写入
    conf.write(open('config.ini','w'))
    
    #打印刚添加的内容
    print(conf.items('add_test'))

    执行完成后会在配置文件如下的内容

    conf.set('section','key','value')

    [add_test]
    name = xiaoke
    age = 25

    修改section的内容

    #导入configparser模块
    import configparser
    
    #生成conf对象
    conf= configparser.ConfigParser()
    
    #加载config.ini文件内容
    conf.read('config.ini')
    
    #打印修改之前的值
    print(conf.items('add_test'))
    
    #修改add_test section的age键
    conf.set('add_test','age','27')
    
    #修改完毕,必须调用write方法写入
    conf.write(open('config.ini','w'))
    
    #打印修改之后的值
    print(conf.items('add_test'))

    ------------------------结果如下-----------------

    修改之前的值
    [('name', 'xiaoke'), ('age', '28')]
    修改之后的值
    [('name', 'xiaoke'), ('age', '27')]

    删除section或者option

    删除section

    config.remove_section("add_test")
    conf.write(open('config.ini','w'))

    删除option

    conf.remove_option('add_test','age')
    conf.write(open('config.ini','w'))

    注意要点

    注意要点:
    1.ConfigParser 在get 时会自动过滤掉‘#’或‘;’注释的行(内容);
    一般情况下我们手工会把配置中的暂时不需要的用‘#’注释,问题在于,Configparser 在wirte的时候同file object行为一致,如果将注释’#’的配置经过get后,再wirte到conf,那么’#’的配置就会丢失。
    那么就需要一个策略或规则,配置需不需要手工编辑 ?还是建立复杂的对原生文本的处理的东西,我建议是管住手,避免将一些重要的配置爆露给用户编辑,切记行内注释和Section内注释。
    有一个相对简单的方法是: 对单独在一行的代码,你可以在读入前把”#”, “;”换成其他字符如’@’,或‘^’(在其bat等其他语言中用的注释符易于理解),使用allow_no_value选项,这样注释会被当成配置保存下来,处理后你再把“#”, “;”换回来。
    2.在ConfigParser write之后,配置文本如果有大写字母’PRODUCT’会变为小写字母’product’,并不影响配置的正确读写。

关键字