我在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'
}
答案 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