2017-03-03 67 views
0

我有,我想使用Python ConfigParser庫來解析形式使用ConfigParser讀取非標準配置文件

# foo.conf 

[section1] 
foo=bar 
buzz=123 

[section2] 
line1 
line2 
line3 

的配置文件。請注意,section2不包含鍵/值對,而是包含一些原始文本。我希望能夠將所有(原始)section2的內容讀取到變量中。

ConfigParser是否允許我讀取這個文件,或者它的某個類可以通過簡單的方式進行子類化?

使用標準

import ConfigParser 

config = ConfigParser.ConfigParser() 
config.read('foo.conf') 

產生ConfigParser.ParsingError: File contains parsing errors: foo.conf

+0

ConfigParser *點是*,它是一個(相對)標準格式。你的格式並不適合他們的方案。 –

+0

你想寫什麼變量?如果您改爲'variable = line1'並繼續以下幾行,它將正常工作。 –

+0

也許你可以將所有這些「行」摺疊爲一個單獨的變量,如'section2 = line1,line2,line3'。它也建議[這裏](http://stackoverflow.com/questions/335695/lists-in-configparser)。當然這取決於你的具體需求。 – farsil

回答

1

您可以嘗試使用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')] 
>>> 
0

據我所知,ConfigParser不能做到這一點:

的ConfigParser類實現一個基本的配置文件解析器 這種語言提供了一種類似於你在上找到的結構210個Microsoft Windows INI文件。

看來你的conf文件不是一個基本的配置文件,所以也許有兩種方法可以解析這個conf文件。

  • 讀取conf文件並對其進行修改。
  • 生成有效的配置文件。
相關問題