您可以嘗試使用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