【问题标题】:Iterate over sections in a config file迭代配置文件中的部分
【发布时间】:2014-03-30 20:31:03
【问题描述】:

我最近被介绍到库 configparser。我希望能够检查每个部分是否至少有一个布尔值设置为 1。例如:

[Horizontal_Random_Readout_Size]
Small_Readout  = 0
Medium_Readout = 0
Large_Readout  = 0

以上会导致错误。

[Vertical_Random_Readout_Size]
Small_Readout  = 0
Medium_Readout = 0
Large_Readout  = 1

以上会通过。以下是我想到的一些伪代码:

exit_test = False
for sections in config_file:
    section_check = False
    for name in parser.options(section):
        if parser.getboolean(section, name):
            section_check = True
    if not section_check:
        print "ERROR:Please specify a setting in {} section of the config file".format(section)
        exit_test = True
    if exit_test:
        exit(1)

问题:

1) 如何执行第一个 for 循环并遍历配置文件的各个部分?

2) 这是一个好方法还是有更好的方法? (如果没有请回答第一个问题。)

【问题讨论】:

    标签: python file configuration sections configparser


    【解决方案1】:

    使用 ConfigParser 你必须解析你的配置。

    解析后你会得到所有使用.sections()方法的部分。

    您可以遍历每个部分并使用.items() 获取每个部分的所有键/值对。

    for each_section in conf.sections():
        for (each_key, each_val) in conf.items(each_section):
            print each_key
            print each_val
    

    【讨论】:

    • 请注意[DEFAULT]部分不包含在conf.sections()返回的列表中
    【解决方案2】:

    最好的办法是将文件中的所有行加载到某种数组中(我将忽略可能使用多少内存以及是否要对其进行分页的问题)。

    然后从那里您知道表示标题的行遵循某种格式,因此您可以遍历数组以创建包含标题名称的对象数组;行索引(对主数组的基于零的引用)以及该标题是否设置了值。

    您可以从那里迭代这些对象以交叉引用主数组,并为每个标题检查当前标题和下一个标题之间的下“n”行(在主数组中)。

    此时,您已确定该标题的各个配置值,因此您应该能够轻松地解析该行并检测一个值,如果为真,您可以从循环中中断,或者为了更稳健,发出排他性检查这些标题的值,以确保只设置一个值。

    使用这种方法,您可以访问所有行,每个标题有一个对象,因此您的代码保持灵活和实用。事后优化。

    希望这有意义且有帮助。

    【讨论】:

    • 请注意,Python 有一个专门的库来解析该配置文件的格式(它将所有内容保存在内存中的一个结构中),之后这只是 API 调用使用的问题。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多