Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
53
Help us understand the problem. What is going on with this article?
@suto3

ConfigParserモジュールの使い方

More than 3 years have passed since last update.

設定ファイル(iniファイル)を扱うConfigParserモジュールについて調べてみました。

INIファイルとは

INIファイル - Wikipedia

  • Windows の設定ファイルとして考案された
  • Windows以外でも設定ファイルのフォーマットとして利用される
  • テキスト形式
  • 容易に編集が可能(ぶっ壊すのも簡単)
  • 拡張子には「.ini」が付く。
  • セクション、キー、キー項目(プロパティ)から構成される

Python におけるINIファイルの扱い

Python には標準でINIファイルの読み書きができるモジュール、ConfigParserが用意されています。

13.2. ConfigParser — 設定ファイルの構文解析器 — Python 2.7ja1 documentation

サンプル Python2版(check_config.py)

で、サンプルとして作ったのが次のツールです。Python 2.7で実行。

check_config.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
check_config.py
設定ファイル(ini file)をチェックするユーティリティ

注意!
エラーチェックはいい加減です。
'''

import ConfigParser
import os
import sys


def show_config(ini):
    '''
    設定ファイルの全ての内容を表示する(コメントを除く)
    '''
    for section in ini.sections():
        print '[%s]' % (section)
        show_section(ini, section)
    return


def show_section(ini, section):
    '''
    設定ファイルの特定のセクションの内容を表示する
    '''
    for key in ini.options(section):
        show_key(ini, section, key)
    return


def show_key(ini, section, key):
    '''
    設定ファイルの特定セクションの特定のキー項目(プロパティ)の内容を表示する
    '''
    print '%s.%s =%s' % (section, key, ini.get(section, key))
    return


def set_value(ini, section, key, value):
    '''
    設定ファイルの特定セクションの特定のキー項目(プロパティ)の内容を変更する
    '''
    ini.set(section, key, value)
    print 'set %s.%s =%s' % (section, key, ini.get(section, key))
    return


def usage():
    sys.stderr.write("Usage: %s inifile [section [key [value]]]\n" % sys.argv[0])
    return


if __name__ == '__main__':
    argc = len(sys.argv)
    if argc == 1:
        usage()
        sys.exit(1)

    # 設定ファイル読み込み
    INI_FILE = sys.argv[1]
    ini = ConfigParser.SafeConfigParser()
    if os.path.exists(INI_FILE):
        ini.read(INI_FILE)
    else:
        sys.stderr.write('%s が見つかりません' % INI_FILE)
        sys.exit(2)

    if argc == 2:
        show_config(ini)
    elif argc == 3:
        show_section(ini, sys.argv[2])
    elif argc == 4:
        show_key(ini, sys.argv[2], sys.argv[3])
    elif argc == 5:
        set_value(ini, sys.argv[2], sys.argv[3], sys.argv[4])
        # ファイルに書き出す(注意!現状だとコメントや改行を消してしまいます)
        f = open(INI_FILE, "w")
        ini.write(f)
        f.close()
    else:
        usage()
        sys.exit(3)

    sys.exit(0)
#EOF

使い方

まー、ソースコードを見れば分かると思いますがw

python check_config.py

引数の指定が無い場合。
usage()(使い方)を表示。
UNIXコマンドのお約束的作法ですね。

python check_config.py inifile

引数がひとつだった場合。
第1引数には、INIファイルのファイル名を指定します。
inifileの内容を表示。

python check_config.py inifile section

引数が2つだった場合。
第2引数には、INIファイルのセクション(section)を指定します。
inifileの特定のセクション(section)の内容を表示。

python check_config.py inifile section key

引数が3つだった場合。
第3引数には、INIファイルの特定セクションのキー項目(key)を指定します。
inifileの特定のセクション(section)の特定のキー項目(key)内容を表示。

python check_config.py inifile section key value

引数が4つだった場合。
第4引数には、INIファイルの特定セクションのキー項目に対して変更する内容(value)指定します。
この操作のみINIファイルを書き換えます。
inifileの特定のセクション(section)の特定のキー項目(key)を内容valueに変更。

サンプル Python3版

いまどきPython2版ばかリではアレなんで、Python3版も用意しました。

Python 3.5で実行。

  • ConfigParser → configparser と名称変更
  • print文が変わった
  • 文字コードの扱いが変わった
check_config.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
check_config.py
設定ファイル(ini file)をチェックするユーティリティ

注意!
エラーチェックはいい加減です。
'''

import configparser
import os
import sys


def show_config(ini):
    '''
    設定ファイルの全ての内容を表示する(コメントを除く)
    '''
    for section in ini.sections():
        print ("[" + section + "]")
        show_section(ini, section)
    return


def show_section(ini, section):
    '''
    設定ファイルの特定のセクションの内容を表示する
    '''
    for key in ini.options(section):
        show_key(ini, section, key)
    return


def show_key(ini, section, key):
    '''
    設定ファイルの特定セクションの特定のキー項目(プロパティ)の内容を表示する
    '''
    print (section + "." + key + " = " + ini.get(section, key))
    return


def set_value(ini, section, key, value):
    '''
    設定ファイルの特定セクションの特定のキー項目(プロパティ)の内容を変更する
    '''
    ini.set(section, key, value)
    print (section + "." + key + " = " + ini.get(section, key))
    return


def usage():
    sys.stderr.write("Usage: " + sys.argv[0] + " inifile [section [key [value]]]\n")
    return


if __name__ == '__main__':
    argc = len(sys.argv)
    if argc == 1:
        usage()
        sys.exit(1)

    # 設定ファイル読み込み
    INI_FILE = sys.argv[1]
    ini = configparser.SafeConfigParser()
    if os.path.exists(INI_FILE):
        ini.read(INI_FILE, encoding='utf8')
    else:
        sys.stderr.write(INI_FILE + " が見つかりません")
        sys.exit(2)

    if argc == 2:
        show_config(ini)
    elif argc == 3:
        show_section(ini, sys.argv[2])
    elif argc == 4:
        show_key(ini, sys.argv[2], sys.argv[3])
    elif argc == 5:
        set_value(ini, sys.argv[2], sys.argv[3], sys.argv[4])
        # ファイルに書き出す(注意!現状だとコメントや改行を消してしまいます)
        with open(INI_FILE, "w", encoding='utf8') as f:
            ini.write(f)
    else:
        usage()
        sys.exit(3)

    sys.exit(0)
#EOF
53
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
suto3

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
53
Help us understand the problem. What is going on with this article?