configparser 模块是标准库中用来解析类似 .ini 文件的模块。

配置文件格式

模块所处理的配置文件格式类似于旧版的 .ini 文件,由多个节区组成,每个节区下面又有不同的选项。

每个节区使用 [section] 方式表示,方括号中间的是节区的名称。

每个节区下面的选项用 key = value 的方式表示,value值可以是 stringintfloatbool,默认为 string 类型。

另外,如果以 ; 或者 # 开头,则这一行的内容为注释行。

例子

配置文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[DEFAULT]
url = %(protocol)s://%(server)s:%(port)s/bugs/
protocol = http
server = 127.0.0.2
port = 80

[bug_tracker]
server = localhost
port = 8080
username = dhellmann
password = SECRET

[text]
long_string = This is a long string,
	the second line is here.

[special]
url = http://${bug_tracker:server}:${DEFAULT:port}/bugs/

读取

configparser 模块可以读取单个文件、多个文件的列表、字符串类型的配置。

1
2
3
4
5
6
7
8
9
from configparser import ConfigParser

parser = ConfigParser()

config_file = "./14.1 configparser.conf"
parser.read(config_file)

config_list = ['1.conf', '2.conf', "./14.1 configparser.conf"]
found = parser.read(config_list)

上面的例子为读取单个文件,以及多个文件的例子,读取多个文件时,不同的配置文件的节区相互调用参数。

获取选项

通过 get() 方法获取节区下的选项的配置值。

1
2
3
4
5
6
7
8
print("default server -> ", parser.get("DEFAULT", "server"))
print("bug_tracker server -> ", parser.get("bug_tracker", "server"))
print('bug_tracker port -> ', parser.getint("bug_tracker", "port"))

# output
default server ->  127.0.0.2
bug_tracker server ->  localhost
bug_tracker port ->  8080

设置选项

通过 set() 方法设置新的选项值。

1
2
3
4
5
6
7
8
print("url -> ", parser.get("DEFAULT", "url"))

parser.set("DEFAULT", "server", "127.0.0.1")
print("url -> ", parser.get("DEFAULT", "url"))

# output
url ->  http://127.0.0.2:80/bugs/
url ->  http://127.0.0.1:80/bugs/

DEFAULT节区

DEFAULT节区 是默认节区,里面的选项被其他节区共享,也就是说,如果在节区中没有找到对应的选项,解析器会在 DEFAULT节区 中进行查找。

1
2
3
4
print('bug_tracker protocol -> ', parser.get("bug_tracker", "protocol"))

# output
bug_tracker protocol ->  http

占位符

在配置文件中,可以使用 %(key)s 的方式使用占位符,key可以为本地节区内的所有选项,如果本地节区未找到,则会去 DEFAULT节区 中查找。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# config
[DEFAULT]
url = %(protocol)s://%(server)s:%(port)s/bugs/
protocol = http
server = 127.0.0.1
port = 80

# py
print("url -> ", parser.get("DEFAULT", "url"))

# output
url ->  http://127.0.0.1:80/bugs/

另外,占位符也可以扩展,选择 别的节区的特定选项

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# config
[special]
url = http://${bug_tracker:server}:${DEFAULT:port}/bugs/

# py
from configparser import ConfigParser, ExtendedInterpolation

parser = ConfigParser(interpolation = ExtendedInterpolation())      # 初始化解析器的时候,需要配置 interpolation 参数
...
print('special url -> ', parser.get("special", "url"))

# output
special url ->  http://localhost:80/bugs/

值得注意的是,占位符只能有一种方式,如果选择了 $ 的方式,那么 % 的方式就不能使用了。反之,亦然。