Python ini 配置读取--configparser

󰃭 2017-04-13

原创作品:首发u3v3, 转载请保留

地址:https://www.u3v3.com/ar/1312

作者ID:Yi_Zhi_Yu

首发日期:2017.4.13

Python学习群:278529278 (欢迎交流)

ini 文件

python下读取.ini文件格式的配置, 可以使用configparser这个包

一般.ini的配置格式如下

[db];[section]
;option=value
host=127.0.0.1 
port=3306
user=Yi_Zhi_Yu
pwd=xxxx

;表示注释内容

以上标记出了不同部分的概念,

[db]中括号里的的db就表示一个section

host=127.0.0.1 则对应的是 option=value

了解这个, 我们对configparser的使用就更容易能看得懂了

configparser

下面我们来看看如何读取读取test.ini文件配置, 配置内容

[db]
host=127.0.0.1 
port=3306
user=Yi_Zhi_Yu
pwd=xxxx
if __name__ == '__main__':
    cfger = configparser.ConfigParser()
    cfger.read_file(open('test.ini'))
    print(cfger.sections()) # ['db'] 输出的是sections
    print(cfger.options('db')) # ['host', 'port', 'user', 'pwd'] 输出的是db 这个section下的options
    print(cfger.get('db', 'host')) # 127.0.0.1 db下的host配置

结果如下

['db'] # sections
['host', 'port', 'user', 'pwd'] # options
127.0.0.1 # db.host

如果get读取不存在的section或者option, configparser会找默认的section 去查找有没有值,

默认的section的是default_section='DEFAULT', 在实例化configparser时自定义

 cfger = configparser.ConfigParser(default_section='default_section_name')

如果连default section也读取不到结果, configparser会抛出NoSectionError或者NoOptionError异常

多.ini文件继承的问题

很多情况下, 我们需要在某些文件中实现文件间的继承关系

比如, 多环境配置时, 有些配置时公用的, 有些是根据不同的环境区别配置的, 这个时候怎么做呢

这里我们有两个文件

common.ini # 公用配置
dev.ini # 开发环境配置

common.ini中的是通用配置, dev.ini是开发环境的配置,

我们希望

  1. common.ini中的配置在不同环境中读取的都是一样的
  2. dev.ini中是仅在开发环境能读取的配置
  3. dev.ini 能覆写 common.ini 中的配置

common.ini中的配置如下

[common]
project_name=Yi_Zhi_Yu
debug=0

dev.ini中的配置如下

[common]
debug=1

[db]
host=127.0.0.1
port=3306
user=Yi_Zhi_Yu
pwd=xxxx

dev环境中, 我们覆写了debug配置, 并新增了db配置

配置读取如下

if __name__ == '__main__':
	cfger = configparser.ConfigParser()
    cfger.read_file(open('common.ini'))
    cfger.read_file(open('dev.ini'))
    print(cfger.sections()) # ['common', 'db']
    print(cfger.options('common')) # ['project_name', 'debug']
    print(cfger.options('db')) # ['host', 'port', 'user', 'pwd']
    print(cfger.get('common', 'project_name')) # Yi_Zhi_Yu
    print(cfger.get('common', 'debug')) # 1
    print(cfger.get('db', 'host'))# 127.0.0.1

完整输出如下

['common', 'db'] # sections
['project_name', 'debug'] # common options
['host', 'port', 'user', 'pwd'] # db options
Yi_Zhi_Yu # common.project_name
1 # common.debug 注意这里的debug是被dev.ini覆写的debug值
127.0.0.1 # db.host

从上面的输出来看, 完全符合我们所需要的继承关系

注意, configparser对多.ini文件的解析非常依赖于read_file的顺序, 后面添加的.ini文件可以继承前面添加的.ini文件的sectionoption 或者 覆盖, 所以请记住这点