🐷

python/3ではINIファイルに特殊な形式が使える

2021/09/04に公開

INIファイルは、古典Windowsが3.1辺りから採用してる設定ファイルだが、形式が簡単で人間にも書きやすいので様々なOSやプログラムで活用されてる。

INIファイル - Wikipedia

python3標準ライブラリには、INIファイルのパーザが組み込まれている。

configparser --- 設定ファイルのパーサー — Python 3.9.4 ドキュメント

このライブラリ群はpure pythonで書かれており、また主要機能は正規表現で処理されている。故にカスタマイズが非常に容易である。

セクションヘッダ SECTCRE

https://docs.python.org/ja/3/library/configparser.html#configparser.ConfigParser.SECTCRE

標準では次の値が設定されてる。

    _SECT_TMPL = r"""
        \[                                 # [
        (?P<header>[^]]+)                  # very permissive!
        \]                                 # ]
        """
    SECTCRE = re.compile(_SECT_TMPL, re.VERBOSE)

書き換える場合は、group("header") を返す必要があるようだ。

何故か行末指定がないので、"[名]=値" のような値をセクション名として受け取ってしまう。

次のようにすると誤検出が少なくなるとおもわれる。

 SECTCRE = re.compile(r'^\[(?P<header>[^]]+)\]$')

値の切り出し OPTCRE

標準では次の値が設定されている

    _OPT_TMPL = r"""
        (?P<option>.*?)                    # very permissive!
        \s*(?P<vi>{delim})\s*              # any number of space/tab,
                                           # followed by any of the
                                           # allowed delimiters,
                                           # followed by any space/tab
        (?P<value>.*)$                     # everything up to eol
        """
    OPTCRE = re.compile(_OPT_TMPL.format(delim="=|:"), re.VERBOSE) 

これを置きかえる場合には、group("option"), group("vi"), group("value") を返す必要がありそうだ。

しかし、SECTREほど簡単な話ではなく、OPT_TMPLでは上の通りdelimによりコンストラクタでの置換の余地を残している。

実際に書き換える場合

例えばキーと値の両方にクオートが使えるといろいろ指定の幅が広がるだろう。

実際には self.OPTCREが直接使われることはなく、configparser.__init__にて、self._optcreが作られる。故にOPTCREを書き換える場合は、configparserを継承して OPT_TMPLを差し替えたほうが上品であるとは言える。

さもなければ次の通りだ。

_optcre = OPTCRE = re.compile(
    r'^(["\']?)(?P<option>(\1|.*))\1\s*(?P<vi>{delim})\s*(["\']?)(?P<value>.*)\5$'.format(
        delim="=")
)

キー名の変換 optionxform

標準では、str.upper が動く。つまり大文字小文字を無視する。
これは、strインスタンスを引数にとってstrインスタンスを返すようなcallableを指定すれば良いので、そのままstrを代入してもよいだろう。

Discussion