Python 标准库的 ConfigParser 模块提供一套 API 来读取和操作配置文件,因为是标准库中的模块,所以无需下载安装。

一、配置文件的格式

1. 配置文件中包含一个或多个 section, 每个 section 有自己的 一个或多个option;

2. section 用 [sect_name] 表示,每个option是一个键值对,使用分隔符 =: 隔开,多用 = ;

3. 在 option 分隔符两端的空格会被忽略掉;

4. 配置文件使用 # 注释;

一个简单的配置文件示例api.conf,下文示例也都以这个配置文件来操作示范:

[db]
db_port = 80
db_host = 192.168.10.200
db_user = root
db_pwd = 123456
switch = True

[HTTP]
scheme = http
host = www.baidu.com
port = 80
timeout = 1.0

二、configparser模块的一些问题

1.不能区分option的大小写;
2.重新写入的配置文件不能保留原有文件的注释;
3.重新写入的配置文件不能保持原有的顺序;
4.不支持嵌套;
5.不支持格式校验;

三、configparser 的基本操作

1、操作配置文件的第一步,实例化 configparser 并加载配置文件

cf = configparser.ConfigParser()
cf.read("api.conf", encoding='utf-8')

2、读取 section 列表、option 键列表和 option 键值元组列表 

sections = cf.sections()    #获取配置文件api.conf的所有section
print(sections)    #打印结果是:['db', 'HTTP']    

db_options = cf.options('db')    #获取section为db下的所有option
print(db_options)    #打印结果是:['db_port', 'db_host', 'db_user', 'db_pwd', 'switch']

values = cf.items('HTTP')    #获取section为HTTP下的所有option键值对
print(values)    #打印结果是:[('scheme', 'http'), ('baseurl', 'api.jiuji.com'), ('port', '80'), ('timeout', '1.0')]

3、读取指定的配置信息,此种读取方式获得的值均为字符串str类型

db_host_val = cf.get('db', 'db_host')    #读取配置文件中db_host对应的值value
print(db_host_val)    #打印结果是: 192.168.10.200

4、按类型读取指定的配置信息,使用getint()、 getfloat() 和 getboolean()方法

port = cf.get('HTTP', 'port')
print(port, type(port))    #打印结果是:80 <class 'str'>

port = cf.getint('HTTP', 'port')
print(port, type(port))    #打印结果是:80 <class 'int'>

timeout = cf.getfloat('HTTP', 'timeout')
print(timeout, type(timeout))    #打印结果是:1.0 <class 'float'>

switch = cf.getboolean('db', 'switch')
print(switch, type(switch))    #打印结果是:True <class 'bool'>

5、判断 section 是否存在

print(cf.has_section('db'))   #打印结果是: True

6、添加 section

cf.add_section('new_section')    #在配置文件中增加一个新的section,section名重复会报错

7、删除 section

cf.remove_section('db')    #删除名为db的section下所有配置

8、判断 option 是否存在

print(cf.has_option('db', 'db_host'))    #打印结果是:True

9、修改option对应的值,或添加一个option,都用set()方法

cf.set('db', 'db_host', '192.168.0.1')    #修改db_host的值为192.168.0.1
print(cf.get('db', 'db_host'))    #打印结果是:192.168.0.1

cf.set('db', 'db_name', 'api_db')    #在db下添加一个键为da_name的option,对应值为api_db

10、删除option

cf.remove_option('db', 'switch')    #删除switch一项
print(cf.options('db'))    #打印结果是:['db_port', 'db_host', 'db_user', 'db_pwd'],少了switch一项

11、保存配置。上述的set、 remove_option、 add_section 和 remove_section 等操作并不会将修改结果保存到配置文件,这时我们用 write 方法将修改的配置保存到文件中

cf.write(open('api.conf', 'w'))

四、其他的一些操作

1、allow_no_value

通常情况下, option 是一个键值对。但是,当 ConfigParser的参数 allow_no_value 设置成 True 时,它允许 option 不设置值而只是作为一个标识。

import configparser

cf = configparser.ConfigParser(allow_no_value=True)    #allow_no_value设置为True
cf.read("api.conf")

cf.set('db', 'db_test')    #我们给db下新增一个没有值的option:db_test
print(cf.get('db', 'db_test'))    #再获取option:db_test的值,会发现打印的值是None

cf.write(open('api.conf', 'w'))

2、DEFAULT section

如果配置文件中存在一个名为 DEFAULT 的 section,那么其他 section 会扩展DEFAULT的 option 并且可以覆盖它的 option。

#新造一个配置文件api.conf

[DEFAULT]
host = 127.0.0.1
port = 3306

[db]
db_port = 80
db_host = 192.168.0.1
db_user = root
db_pwd = 123456

[HTTP]
scheme = http
baseurl = api.jiuji.com
port = 80
timeout = 1.0
host = 192.168.255.255

再看下面语句的执行结果

print(cf.get('DEFAULT', 'host'))    #结果:127.0.0.1
print(cf.get('db', 'host'))    #结果:127.0.0.1    
print(cf.get('HTTP', 'host'))    ##结果:192.168.255.255

3、插值 Interpolation

这个不好 用文字来描述,看示例:

#我们再新造一个配置文件api.conf

[DEFAULT]
url = %(protocol)s://%(server)s:%(port)s/

[http]
protocol = http
server = localhost
port = 8080

[ftp]
url = %(protocol)s://%(server)s/
protocol = ftp
server = 192.168.1.102

再看下语句的执行结果

import configparser

cf = configparser.ConfigParser()
cf.read("api.conf", encoding='GBK')

print(cf.get('http', 'url'))    #结果:http://localhost:8080/
print(cf.get('ftp', 'url'))    #结果:ftp://192.168.1.102/

4、configparser还有其他的一些特性,请参照官方文献:https://docs.python.org/3/library/configparser.html