我最近介绍了库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)这是一个很好的方法吗?还是有更好的方法? (如果没有请回答问题一。)
答案 0 :(得分:48)
使用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
答案 1 :(得分:1)
最好的办法是将文件中的所有行加载到某种类型的数组中(我将忽略可能使用的内存量以及是否通过它进行分页的问题。)
然后从那里你知道表示标题的行遵循某种格式,因此你可以迭代你的数组来创建一个包含标题名称的对象数组;行索引(对主数组的零引用)以及该标题是否设置了值。
从那里你可以在交叉引用主数组时迭代这些对象,并且对于每个标题,检查当前标题和下一个标题之间的下一个“n”行(在主数组中)。
此时,您可以查看该标题的各个配置值,这样您就可以轻松地解析该行并检测一个值,如果为true,您可以从循环中断,或者为了更强大,可以排除一个排他性检查这些标题的值,以确保只设置一个值。
使用这种方法,您可以访问所有行,每个标题有一个对象,因此您的代码保持灵活和功能。之后进行优化。
希望这是有道理的,也是有帮助的。