您可以尝试使用io适配器以适合ConfigParser的格式转换输入文件。一种方法是转换既不是空行也不是注释行的普通行,也不在linei=original_line
中的行不是key=value
行,其中每行增加i,并在每个行中从1开始。
一个可能的代码可能是:
class ConfParsAdapter(io.RawIOBase):
@staticmethod
def _confParsAdapter(fd):
num=1
rxsec = re.compile('\[.*\](*#.*)?$')
rxkv = re.compile('.+?=.*')
rxvoid = re.compile('(#.*)?$')
for line in fd:
if rxsec.match(line.strip()):
num=1
elif rxkv.match(line) or rxvoid.match(line.strip()):
pass
else:
line = 'line{}={}'.format(num, line)
num += 1
yield(line)
def __init__(self, fd):
self.fd = self._confParsAdapter(fd)
def readline(self, hint = -1):
try:
return next(self.fd)
except StopIteration:
return ""
这样,您可以与您现有的文件中使用而无需改变任何东西:
>>> parser = ConfigParser.RawConfigParser()
>>> parser.readfp(ConfParsAdapter(open('foo.conf'))
>>> parser.sections()
['section1', 'section2']
>>> parser.items('section2')
[('line1', 'line1'), ('line2', 'line2'), ('line3', 'line3')]
>>>
ConfigParser *点是*,它是一个(相对)标准格式。你的格式并不适合他们的方案。 –
你想写什么变量?如果您改为'variable = line1'并继续以下几行,它将正常工作。 –
也许你可以将所有这些“行”折叠为一个单独的变量,如'section2 = line1,line2,line3'。它也建议[这里](http://stackoverflow.com/questions/335695/lists-in-configparser)。当然这取决于你的具体需求。 – farsil