configparser是python推荐使用的配置文件管理模块,特别适用于简单字符串构成的
key-value
对配置信息。
其配置信息一般保存于
config.ini
文件,文件内容示例如下:
[DEFAULT]
author = guofei
project = DM
date = 2019-12-19
[MySQL]
hostname = 192.168.0.202
port = 3306
database = sql_1
username = root
password = 123456
[server.com]
host port = 50022
e-mail = 123456@163.com
配置文件按层级分为:
-
sections
,方括号[ ]中包裹的名称,如DEFAULT、MySQL和server.com,其区分大小写。 -
options
,可理解为每个section下的
键值对
,用于设定相关的配置信息。其中key默认不区分大小写(默认为小写),而value区分大小写,且均会被认为是
str
类型数据。所以对于类似于value为列表的复杂的配置信息,可采用json、yaml等格式进行编写。
在
sections
包含一类特殊的section:
DEFAUTL
,即默认配置。其它的sections会默认继承
DEFAUTL
中的键值对信息,但当某section中包含与
DEFAUTL
相同的键时,会自动覆盖原始信息(其它的sections中仍保留
DEFAUTL
中的原始键值对)。
1. 定义字典,写入配置文件
import configparser
config = configparser.ConfigParser() #实例化一个对象
config["DEFAULT"] = {'Author': 'guofei',
'Project': 'DM',
'Date': '2019-12-19',
} #类似于操作字典的形式
config['MySQL'] = {
'HOSTNAME': '192.168.0.202',
'PORT': '3306',
'DATABASE': 'sql_1',
'USERNAME': 'root',
'PASSWORD': '123456'
}
config['server.com'] = {'Host Port':'50022','E-mail':'123456@163.com'}
with open('config_test.ini', 'w') as f:
config.write(f)
2. 读入现有配置文件
config = configparser.ConfigParser()
config.read('config_test.ini')
3. 配置信息的增删改查
3.1 查看
# 查看所有的section,并不输出DEFAULT的
config.sections() # 返回 ['MySQL', 'server.com']
# 判断是否存在某section
print("MySQL" in config2) # 返回 True
print("Redis" in config2) # 返回 False
# 因为config对象的结构类似于双层嵌套的字典,所以可迭代查看所有的键值对
for sections, options in config.items():
for key, value in options.items():
print("{}:{}-{}".format(sections, key, value))
# 返回如下信息,注意此时DEFAULT会被输出,其它sections也会集成DEFAULT中的key-value
""" DEFAULT:author-guofei DEFAULT:project-DM DEFAULT:date-2019-12-19
MySQL:hostname-192.168.0.202 MySQL:port-3306 MySQL:database-sql_1 MySQL:username-root MySQL:password-123456 MySQL:author-guofei MySQL:project-DM MySQL:date-2019-12-19
server.com:host port-50022 server.com:e-mail-123456@163.com server.com:author-guofei server.com:project-DM server.com:date-2019-12-19
"""
# 查看某个section的所有options的键值对,直接返回一个mapping的列表,可直接dict操作
config.items("MySQL") # [('author', 'guofei'), ('project', 'DM'), ('date', '2019-12-19'), ('hostname', '192.168.0.202'), ('port', '3306'), ('database', 'sql_1'), ('username', 'root'), ('password', '123456')]
# 查看某个section的所有options的键,可看到DEFAULT中的key-value被继承
config.options("MySQL") # 返回['hostname', 'port', 'database', 'username', 'password', 'author', 'project', 'date']
# 查看某个section下某个option的值
config.get("MySQL", "hostname") # 方法1,返回'192.168.0.202'
config['MySQL']['hostname'] # 方法2
3.2 修改
config.set("MySQL", 'hostname', '192.168.0.208')
config['MySQL']['hostname'] # 修改成功,返回'192.168.0.208'
3.3 添加
# 添加setion名
config.add_section("Redis")
# 若还未配置,只输出DEFAULT下的值
config.items("Redis") # 返回[('author', 'guofei'), ('project', 'DM'), ('date', '2019-12-19')]
# 新增section下的新的option
config.set("Redis", "broker_url", "redis://172.27.0.8:6379/2")
config.set("Redis", "result_backend", "redis://172.27.0.8:6379/6")
3.4 删除
config.remove_option("MySQL", "database") # 删除成功,返回True
config.remove_section("MySQL") # 删除成功,返回True
3.5 保存配置
上述【增删改】后的记录仅保存在缓存中,要持久性保存,仍需要写入文件。
with open('config_test2.ini', 'w') as f:
config.write(f)
4. 其它问题
4.1 option中key的小写问题
正如在文章开头介绍的那样,
options
中的
key
默认小写,不区分大小写。因此如果在
.ini
文件中将
key
配置为大写,则会导致读出的
key
与源文件
key
不一致的问题。
其原因在于
ConfigParser
的父类
RawConfigParser
的
optionxform
方法中强制进行了
小写转换
。
def optionxform(self, optionstr):
return optionstr.lower()
为避免该问题,可改写改方法:
class NewConfig(configparser.ConfigParser):
def optionxform(self, option_str):
return option_str
然后用这个
NewConfig
去实现配置操作。
4.2 option中value的字符串问题
option
中
value
输出默认为
str
,为了取得其实际的数据类型,父类
RawConfigParser
提供了专门的取值方法。
config.getint() # 取得整数类型value
config.getfloat() # 取得浮点数类型value
config.getboolean() # 取得布尔类型value
本文完整的交互式文件请戳
这里