文章目录
-
ini文件简介
-
python自带的configparser模块解析ini文件
ini文件简介
ini文件一般用来作为配置文件,主要由以下四个部分组成
-
section(节)
-
key(键)
-
value(值)
-
comment(注释):注释以分号为起点
组成形式如下:
[section]
; comment_1
key = value ; comment_2
python自带的configparser模块解析ini文件
测试文件
我们先建立一个用来做测试的ini文件,起名为
config.ini
,内容如下:
[root_folder] ; comment 1
; comment 2
data = E:\data
label = E:\label
[color]
rect = red
point = green
[line]
type = 8 ; solid line
thickness = 2
其中加了很多无意义的空格,用来测试
configparser
对空格的处理能力。
解析和打印
既然是现成模块,解析代码非常简单,先建立一个
ConfigParser()
类,然后使用
read()
方法即可,输入参数是文件名。
# -*- coding: utf-8 -*-
import configparser
def print_ini(config):
for section in config.sections():
print('[%s]' % section)
for key in config.options(section):
print('%s = %s' % (key, config.get(section, key)))
if __name__ == '__main__':
config = configparser.ConfigParser()
config.read('config.ini')
print_ini(config)
print_ini
打印的内容如下:
[root_folder]
data = E:\data
label = E:\label
[color]
rect = red
point = green
[line]
type = 8 ; solid line
thickness = 2
从以上打印的结果可以确认一件事:原配置文件中无意义的空格并没有对解析造成影响,解析结果忽略了这些无意义的空格。
另外需注意:所有的section,key,value都以
str
类型保存。
无法解析注释
关于注释要特别提出来:
configparser
无法解析注释。
上面的打印内容有一行是:
我们专门把section=line, key=type的value打印出来:
print(config.get('line', 'type'))
发现其结果是:
也就是说分号及其后面的
; solid line
都被算作value的一部分了,而不是作为注释被忽略掉。这会引起bug,是个缺陷。
另外,原配置文件中的两条注释:位于第一行的
comment 1
和第二行的
comment 2
被忽略掉了。
所以总体来说:
-
key-value
所在行中不能有注释,不然注释会被解析为
value
的一部分(会引起bug)
-
section
行尾的注释和单独占一行的注释会被忽略掉(对使用而言没什么影响,但如果想要再次保存的话那注释就没了)
增删改查
想要用的顺畅,就要把
增删改查
玩的溜。
configparser
自带了很多方法可以方便我们使用,下面挑主要的介绍。
查所有的section名字
返回由所有section name组成的list,比如本例中返回的是
['root_folder', 'color', 'line']
查某个section中所有的key名字
输入参数是section的名字。
返回值是section下所有key name组成的list,比如
config.options('color')
返回
['rect', 'point']
请注意:查询key的方法叫
options()
而不是
keys()
,名字看着有点难受。
查某个section是否存在
config.has_section(section)
输入参数是section的名字,输出是
True或False
。
比如:
print(config.has_section('color')) # ==> True
print(config.has_section('param')) # ==> False
查某个section中的某个key是否存在
config.has_option(section, key)
输入是section和key的名字,输出是
True或False
。
比如:
print(config.has_option('color', 'rect')) # ==> True
print(config.has_option('color', 'circle')) # ==> False
增加一个section
config.add_section(section)
输入的section不能是config中的已有section,否则报错。
比如:
config.add_section('param') # success to add a section named param
config.add_section('color') # ==> configparser.DuplicateSectionError: Section 'color' already exists
增加(改变)某个section中的某个key
config.set(section, key, value)
section必需是config中已经存在的。key可以不存在,也可以存在,如果不存在则增加一个key,如果存在则修改key的值。
比如:
config.set('color', 'circle', 'blue')
config.set('color', 'rect', 'yellow')
执行后color section变为:
[color]
rect = yellow
point = green
circle = blue
而下面命令则会报错:
config.set('colors', 'rect', 'yellow') # ==> configparser.NoSectionError: No section: 'colors'
删除一个section
config.remove_section(section)
section如果在config中不存在则什么也不做,如果存在则删除整个section,包括其中所有的key-value。
删除某个section中的某个key-value
config.remove_option(section, option)
section必需存在,否则会报错;option随意,如果存在则删除当前key-value,若不存在则什么也不做。
保存至文件
with open('config_save.ini', 'w') as fid:
config.write(fid)