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