在ConfigParser中多次指定相同选项

6 投票
1 回答
1902 浏览
提问于 2025-04-17 14:11

我想用Python的ConfigParser模块来读取一个配置文件:

[asection]
option_a = first_value
option_a = second_value

我还想获取为选项'option_a'指定的值列表。我尝试了下面这个比较明显的方法:

test = """[asection]
option_a = first_value
option_a = second_value
"""
import ConfigParser, StringIO
f = StringIO.StringIO(test)
parser = ConfigParser.ConfigParser()
parser.readfp(f)
print parser.items()

结果输出是:

[('option_a', 'second_value')]

但我其实希望得到的是:

[('option_a', 'first_value'), ('option_a', 'second_value')]

或者,更好的是:

[('option_a', ['first_value', 'second_value'])]

有没有办法用ConfigParser做到这一点?或者有什么其他的想法?

1 个回答

1

看起来可以为同一个键读取多个选项,这可能会对你有帮助:

如何在配置文件中为相同的键保留多个值?

这里是这个链接中的最终代码(我在 Python 3.8 上测试过):

from collections import OrderedDict
from configparser import ConfigParser
class ConfigParserMultiValues(OrderedDict):
    def __setitem__(self, key, value):
        if key in self and isinstance(value, list):
            self[key].extend(value)
        else:
            super().__setitem__(key, value)

    @staticmethod
    def getlist(value):
        return value.splitlines()

config = ConfigParser(strict=False, empty_lines_in_values=False, dict_type=ConfigParserMultiValues, converters={"list": ConfigParserMultiValues.getlist})
config.read(["test.ini"])
values = config.getlist("test", "foo")
print(values)

对于内容为:

[test]
foo = value1
foo = value2
xxx = yyy

输出结果是:

['value1', 'value2']

撰写回答