用Python ConfigObj处理配置文件

有三种方法可以读取/修改INI配置

  1. 使用Linux下的命令工具crudini
  2. 使用ConfigParser模块
  3. 使用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检查做转换,那个又需要另外一个模块。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容