利用configparser写配置文件

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的父类RawConfigParseroptionxform方法中强制进行了小写转换

def optionxform(self, optionstr):
    return optionstr.lower()

为避免该问题,可改写改方法:

class NewConfig(configparser.ConfigParser):
    def optionxform(self, option_str):
        return option_str

然后用这个NewConfig去实现配置操作。

4.2 option中value的字符串问题

optionvalue输出默认为str,为了取得其实际的数据类型,父类RawConfigParser提供了专门的取值方法。

config.getint()     # 取得整数类型value
config.getfloat()    # 取得浮点数类型value
config.getboolean()    # 取得布尔类型value

本文完整的交互式文件请戳这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值