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是开发环境的配置,
我们希望
common.ini中的配置在不同环境中读取的都是一样的dev.ini中是仅在开发环境能读取的配置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文件的section和option 或者 覆盖, 所以请记住这点