hatunina’s blog

メモと日記です

Pythonのconfigparserで設定ファイルを読み込む

mainのプロセスで初期化する内容が多くなって来た時には設定ファイルを作成して読み込むのが良い。

例えば、こんな感じのmain.pyがあったとします。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


class Main(object):
    def __init__(self):
        self.data_dir= '../data/'
        self.input_file_name= 'test.tsv'
        self.flag_spam = True
        self.flag_egg = False

    def run(self):
        if self.flag_spam:
           print(self.data_dir)

        if self.flag_egg:
           print(self.input_file_name)


if __name__ == '__main__':
    main = Main()
    main.run()

コンストラクタにフラグやらパスやらまとめられていてつらい。 Mainクラスと言えどもこういう設定関連はどんどん増えていくのであまりここには書きたくない。。。

そんな時は.iniとかで設定ファイルを作ってconfigparserで読み込みましょう〜

[Path]
data_dir: ../data/
input_file_name: test.tsv

[Flag]
flag_spam: True
flag_egg: False

こんな感じのファイルをconfigディレクトリとか作ってconfig.iniやらテキトーな名前で保存します。 ちなみに、コロンではなくイコールで繋ぐことも可能です。

そして先ほどのmain.pyを書き換えます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import configparser
from distutils.util import strtobool


class Main(object):
    def __init__(self):
        self.config_path = '../config/config.ini'
        self.config = configparser.ConfigParser()
        self.config.read(self.config_path)

    def run(self):
        if strtobool(self.cfg.config['Flag']['flag_spam']):
           print(self.cfg.config['Path']['data_dir'])

        if strtobool(self.cfg.config['Flag']['flag_egg']):
           print(self.cfg.config['Path']['input_file_name'])


if __name__ == '__main__':
    main = Main()
    main.run()

Flagはstringで読み込まれるのでstrtobool関数で変換します。 Trueが1、Falseが0へ変換されるのでそのままbooleanとして扱えますね。

参考
14.2. configparser — 設定ファイルのパーサー — Python 3.6.4 ドキュメント