zoukankan      html  css  js  c++  java
  • configParser模块详谈

    前言

      使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是configParser

      configParser解析的配置文件的格式比较象ini的配置文件格式,就是文件中由多个section构成,每个section下又有多个配置项

    ConfigParser简介


      ConfigParser 是用来读取配置文件的包。配置文件的格式如下:中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容。

    ConfigParser模块在python3中修改为configparser.这个模块定义了一个ConfigParser类,该类的作用是使用配置文件生效,配置文件的格式和windows的INI文件的格式相同

      该模块的作用 就是使用模块中的RawConfigParser()ConfigParser()、 SafeConfigParser()这三个方法(三者择其一),创建一个对象使用对象的方法对指定的配置文件做增删改查 操作。配置文件有不同的片段组成和Linux中repo文件中的格式类似:

    ini

    1、ini配置文件格式如下:

    #这是注释
    ;这里也是注释 [section0] key0 = value0 key1 = value1 [section1] key2 = value2 key3 = value3

      样例配置文件example.ini

    [db]
    db_host = 127.0.0.1
    db_port = 69
    db_user = root
    db_pass = root
    host_port = 69
    
    [concurrent]
    thread = 10
    processor = 20
    

      

    2、section不能重复,里面数据通过section去查找,每个seletion下可以有多个key和vlaue的键值对,注释用英文分号(;)

    configparser

    1、python3里面自带configparser模块来读取ini文件

    # python3
    import configParser

      敲黑板:python2的版本是Configparser

    # python2
    import ConfigParser

    2、在pycharm里面,新建一个ini文件:右键New->File, 输入框直接写一个.ini后缀文件就行了,然后写数据

     

    3、ConfigParser 初始化对象

      使用ConfigParser 首选需要初始化实例,并读取配置文件:

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")

      

    4、注释里面有中文的话,这里代码跟python2是有点区别的,python2里面直接conf.read(cfgpath)就可以了,python3需要加个参数:encoding=”utf-8”

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")

      

      敲黑板:如果ini文件里面写的是数字,读出来默认是字符串

    # coding:utf-8
    # 作者:古风尘
    
    
    import configparser
    import os
    curpath = os.path.dirname(os.path.realpath(__file__))
    cfgpath = os.path.join(curpath, "demo.ini")
    print(cfgpath)  # demo.ini的路径
    
    # 创建管理对象
    conf = configparser.ConfigParser()
    
    # 读ini文件
    conf.read(cfgpath, encoding="utf-8")  # python3
    
    # conf.read(cfgpath)  # python2
    
    # 获取所有的section
    sections = conf.sections()
    
    print(sections)  # 返回list
    
    items = conf.items('db')
    print(items)  # list里面对象是元祖

      运行结果:

    D:debug_p3cfgdemo.ini
    ['db_host', 'concurrent','book'] 
    [('db_port', '127.0.0.1'),
    ('db_user', 'root'), 
    ('db_pass', 'root'), 
    ('hosr_port', '69')]

    ConfigParser 常用方法

    获取section节点

    1、获取所用的section节点

    # 获取所用的section节点
    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    print(config.sections())
    #运行结果
    # ['db', 'concurrent','book']

     2、获取指定section 的options

      即将配置文件某个section 内key 读取到列表中:

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    r = config.options("db")
    print(r)
    #运行结果
    # ['db_host', 'db_port', 'db_user', 'db_pass', 'host_port']

    3、获取指点section下指点option的值

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    r = config.get("db", "db_host")
    # r1 = config.getint("db", "k1") #将获取到值转换为int型
    # r2 = config.getboolean("db", "k2" ) #将获取到值转换为bool型
    # r3 = config.getfloat("db", "k3" ) #将获取到值转换为浮点型
    print(r)
    #运行结果
    # 127.0.0.1

    4、获取指点section的所用配置信息

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    r = config.items("db")
    print(r)
    #运行结果
    #[('db_host', '127.0.0.1'), ('db_port', '69'), ('db_user', 'root'), ('db_pass', 'root'), ('host_port', '69')]

    5、修改某个option的值,如果不存在则会出创建

    # 修改某个option的值,如果不存在该option 则会创建
    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    config.set("db", "db_port", "69")  #修改db_port的值为69
    config.write(open("ini", "w"))
    [db]
    db_host = 127.0.0.1
    db_port = 69
    db_user = root
    db_pass = root
    
    [concurrent]
    thread = 10
    processor = 20
    

      

     
    6、检查section或option是否存在,bool值
    import configparser
    config = configparser.ConfigParser()
    config.has_section("section") #是否存在该section
    config.has_option("section", "option")  #是否存在该option

    remove

    1、如果想删除section中的一项,比如我想删除[email_163]下的port 这一行

    # 删除一个 section中的一个 item(以键值KEY为标识)
    conf.remove_option('concurrent', "thread")

    2、删除整个section这一项

    conf.remove_section('concurrent')
    3、删除section 和 option
     
    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    config.remove_section("default") #整个section下的所有内容都将删除
    config.write(open("ini", "w"))
    [db]
    db_host = 127.0.0.1
    db_port = 69
    db_user = root
    db_pass = root
    
    [concurrent]
    thread = 10
    processor = 20
    

      

    add

    1、新增一个section

    # 添加一个select
    conf.add_section("emali_tel")
    print(conf.sections())

    2、section里面新增key和value

    # 往select添加key和value
    conf.set("emali_tel", "sender", "yoyo1@tel.com")
    conf.set("emali_tel", "port", "265")
     
    3、添加section 和 option
    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    if not config.has_section("default"):  # 检查是否存在section
        config.add_section("default")
    if not config.has_option("default", "db_host"):  # 检查是否存在该option
        config.set("default", "db_host", "1.1.1.1")
    config.write(open("ini", "w"))
    [db]
    db_host = 127.0.0.1
    db_port = 69
    db_user = root
    db_pass = root
    
    [concurrent]
    thread = 10
    processor = 20
    
    [default]
    db_host = 1.1.1.1
    

      

     

    write写入

    1、write写入有两种方式,一种是删除原文件内容,重新写入:w

    conf.write(open(cfgpath, "w"))  # 删除原文件重新写入

      另外一种是在原文件基础上继续写入内容,追加模式写入:a

    conf.write(open(cfgpath, "a"))  # 追加模式写入

    2、前面讲的remove和set方法并没有真正的修改ini文件内容,只有当执行conf.write()方法的时候,才会修改ini文件内容,举个例子:在ini文件上追加写入一项section内容

    # coding:utf-8
    import configparser
    import os
    curpath = os.path.dirname(os.path.realpath(__file__))
    cfgpath = os.path.join(curpath, "cfg.ini")
    print(cfgpath)  # cfg.ini的路径
    
    # 创建管理对象
    conf = configparser.ConfigParser()
    
    # 添加一个select
    conf.add_section("emali_tel")
    print(conf.sections())
    
    # 往select添加key和value
    conf.set("emali_tel", "sender", "yoyo1@tel.com")
    conf.set("emali_tel", "port", "265")
    items = conf.items('emali_tel')
    print(items)  # list里面对象是元祖
    
    conf.write(open(cfgpath, "a"))  # 追加模式写入

      运行后会发现ini文件最后新增了写入的内容了

     3、写入文件

      以下的几行代码只是将文件内容读取到内存中,进过一系列操作之后必须写回文件,才能生效

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")

      

      写回文件的方式如下:(使用configparser的write方法)

    config.write(open("ini", "w"))  # 删除原文件重新写入

    综合实例:

    #coding=utf-8
     
    import ConfigParser
     
    def writeConfig(filename):
        config = ConfigParser.ConfigParser()  #创建ConfigParser实例
        # set db
        section_name = 'db'
        config.add_section( section_name )  #添加一个配置文件节点(str
        config.set( section_name, 'dbname', 'MySQL')
        config.set( section_name, 'host', '127.0.0.1')
        config.set( section_name, 'port', '80')
        config.set( section_name, 'password', '123456')
        config.set( section_name, 'databasename', 'test')
     
        # set app
        section_name = 'app'
        config.add_section( section_name )
        config.set( section_name, 'loggerapp', '192.168.20.2')
        config.set( section_name, 'reportapp', '192.168.20.3')
     
        # write to file
        config.write( open(filename, 'a') )  #写入配置文件
     
    def updateConfig(filename, section, **keyv):
        config = ConfigParser.ConfigParser()
        config.read(filename)
        print config.sections()          #返回配置文件中节序列
        for section in config.sections():
            print "[",section,"]"
            items = config.items(section)    #返回某个项目中的所有键的序列
            for item in items:
                print "	",item[0]," = ",item[1]
        print config.has_option("dbname", "MySQL")
        print config.set("db", "dbname", "11")  #设置db节点中,键名为dbname的值(11)
        print "..............."
        for key in keyv:
            print "	",key," = ", keyv[key]
        config.write( open(filename, 'r+') )
     
    if __name__ == '__main__':
        file_name = 'test.ini'
        writeConfig(file_name)
        updateConfig(file_name, 'app', reportapp = '192.168.100.100')
        print "end__"
  • 相关阅读:
    MY_HOME
    跨站请求伪造CSRF防护方法
    python中的函数参数
    python 中的闭包
    append追加元素绑定事件无效的解决办法
    webservice练习(cxf,axis,httpclient)
    hibernate5 mysql写入中文乱码
    今天面试中遇到的几个sql查询问题
    Eclipse运行maven项目是出现-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.这种问题解决办法
    模拟博客园登录java实现
  • 原文地址:https://www.cnblogs.com/gufengchen/p/10929463.html
Copyright © 2011-2022 走看看