有三种方法可以读取/修改INI配置
- 使用Linux下的命令工具crudini
- 使用ConfigParser模块
- 使用ConfigObj模块
似乎ConfigObj的功能比ConfigParser更齐全一些。比如ConfigParser不支持下面这些特性:
- 不能区分大小写。
- 重新写入的ini文件不能保留原有INI文件的注释。
- 重新写入的ini文件不能保持原有的顺序。
- 不支持嵌套。
- 不支持格式校验。
ConfigObj这个module的参考文档可以到 https://configobj.readthedocs.io/en/latest/index.html
查看。
读配置文件
from configobj import ConfigObj
config = ConfigObj(filename)
配置文件的内容按照字典dict的方式读出。嵌套的字段subsection也是一个字典。例子如下:
from configobj import ConfigObj
config = ConfigObj(filename)
#
value1 = config['keyword1']
value2 = config['keyword2']
#
section1 = config['section1']
value3 = section1['keyword3']
value4 = section1['keyword4']
#
# you could also write
value3 = config['section1']['keyword3']
value4 = config['section1']['keyword4']
写配置文件
from configobj import ConfigObj
config = ConfigObj()
config.filename = filename
#
config['keyword1'] = value1
config['keyword2'] = value2
#
config['section1'] = {}
config['section1']['keyword3'] = value3
config['section1']['keyword4'] = value4
#
section2 = {
'keyword5': value5,
'keyword6': value6,
'sub-section': {
'keyword7': value7
}
}
config['section2'] = section2
#
config['section3'] = {}
config['section3']['keyword 8'] = [value8, value9, value10]
config['section3']['keyword 9'] = [value11, value12, value13]
#
config.write()
如果不指定文件名,write()会返回输出一个列表。
配置文件中的keywords和section必须是字符串,否则会返回ValueError。
配置文件的格式
格式比较简单,参考下面的代码示例。要点就是[] 和 = 两个符号。
# This is the 'initial_comment'
# Which may be several lines
keyword1 = value1
'keyword 2' = 'value 2'
[ "section 1" ]
# This comment goes with keyword 3
keyword 3 = value 3
'keyword 4' = value4, value 5, 'value 6'
[[ sub-section ]] # an inline comment
# sub-section is inside "section 1"
'keyword 5' = 'value 7'
'keyword 6' = '''A multiline value,
that spans more than one line :-)
The line breaks are included in the value.'''
[[[ sub-sub-section ]]]
# sub-sub-section is *in* 'sub-section'
# which is in 'section 1'
'keyword 7' = 'value 8'
[section 2] # an inline comment
keyword8 = "value 9"
keyword9 = value10 # an inline comment
# The 'final_comment'
# Which also may be several lines
注意:
上面的keyword和value以及section有的使用引号有的没有用引号,都是正确的表示法。
如果一个keyword或者value本身以空白符/引号/逗号做开头或者结尾,就必须使用引号来把他包起来。
Value可以是一个列表。表示方式就是在后面跟一个逗号。如下例:
keyword1 = value1, value2, value3
keyword2 = value1, # a single member list
keyword3 = , # an empty list
如果Value包含跨行符号(多行),则需要使用三引号包括起来。如下例:
keyword1 = ''' A multi line value
on several
lines''' # with a comment
keyword2 = '''I won't be "afraid".'''
#
keyword3 = """ A multi line value
on several
lines""" # with a comment
keyword4 = """I won't be "afraid"."""
Value 默认是** 字符串 **。这个很容易混淆。比如下面的Style 的值读出后并不是整数0,而是字符‘0‘。
#配置文件
'signal_name' = '[31:0] inst_rd_data'
'style' = 0 #1: verilog-2001, 0:verilog-1995.
下面是Python 代码:结果只会跑到else分支中去。
from configobj import ConfigObj
config = ConfigObj("config.ini")
signal = config['signal_name']
style = config['style']
if style == 0 :
# do something
else :
# do other thing
解决办法是改成这样:
style = int(config['style'])
也可以使用Validation检查做转换,那个又需要另外一个模块。