利用configparser写配置文件

  • Post author:
  • Post category:其他


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

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

这里



版权声明:本文为guofei_fly原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。