簡體   English   中英

使用ConfigParser讀取非標准配置文件

[英]Using ConfigParser to read non-standard config files

我有以下形式的配置文件

# foo.conf

[section1]
foo=bar
buzz=123

[section2]
line1
line2
line3

我想使用Python ConfigParser庫進行解析。 請注意, section2不包含鍵/值對,而是包含一些原始文本。 我想有可能將section2所有(原始)內容讀入一個變量。

ConfigParser是否允許我讀取此文件,或者可以通過一種簡單的方式將其子類進行子類化嗎?

使用標准

import ConfigParser

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

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

您可以嘗試使用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無法做到這一點:

ConfigParser類實現一種基本的配置文件解析器語言,該語言提供的結構類似於您在Microsoft Windows INI文件中找到的結構。

似乎您的conf文件不是基本的配置文件,因此可能有兩種方法可以解析此conf文件。

  • 讀取conf文件並進行修改。
  • 生成有效的配置文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM