在python中读取非传统的INI

时间:2016-08-10 16:36:09

标签: python ini configparser

我在python中编写脚本来读取.INI文件。我知道有一个名为configparser的库,但我的.INI与“标准”略有不同。

通常,文件应该是:

[HEADER]
username john
fruits oranges apples

但在我的情况下,我必须阅读类似的内容:

[HEADER]
day1 bananas oranges
day1 apples avocado
day2 bananas apples

有没有简单的方法可以做到这一点,或者我必须自己创建解析器?

- 已编辑 -

伙计们,谢谢你的回答。我忘了提一些非常重要的东西。在INI文件中(它由专有且痛苦的软件生成),它也可以有多个具有相同密钥的行。我会举个例子。

ClassToTest myClass = new ClassToTest(serviceA: Mock(AnotherService))

def "test my method"() {
  when:
  myClass.methodToTest([])

  then:
  1 * myClass.serviceA.someFunction([]) >> 'A string'
}

1 个答案:

答案 0 :(得分:0)

这似乎是你要编写自己的解析器来处理的事情。我仍然将它放入ConfigParser对象中,但只有这样才能在将来更容易使用。 configparser.ConfigParser可以几乎您需要做的一切。我不知道有什么方法可以告诉它来对待

[SomeHeader]
foo = bar
foo = baz
正如你在问题的最后提到的那样,{p>为config["SomeHeader"]["foo"] == ["bar", "baz"]

您可以尝试以下方式:

def is_section_header(text):
    # what makes a section header? To me it's a word enclosed by
    # square brackets.
    match = re.match(r"\[([^\]]+)\]", text)
    if match:
        return match.group(1)

def get_option_value_tuple(line):
    """Returns a tuple of (option, comma-separated values as a string)"""
    option, *values = line.split(" ")
    return (option, ", ".join(values))

def parse(filename):
    config = configparser.ConfigParser()
    cursection = None
    with open(filename) as inifile:
        for line in inifile:
            sectionheader = is_section_header(line)
            if sectionheader:
                cursection = sectionheader
                try:
                    config.add_section(sectionheader)
                except configparser.DuplicateSectionError:
                    # This section already exists!
                    # how should you handle this?
                    continue  # ignore for now
            else:
                option, values = get_option_value_tuple(line.strip())
                if config.has_option(cursection, option):
                    config[cursection][option] += (", " + values)
                else:
                    config[cursection][option] = values
    return config

这将使:

[SomeHeader]
foo bar baz
foo spam eggs
bar baz

解析与

的标准解析相同
[SomeHeader]
foo = bar, baz, spam, eggs
bar = baz