ConfigParserモジュールの使い方

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

###INIファイルとは

[INIファイル - Wikipedia](http://ja.wikipedia.org/wiki/Ini%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB "INIファイル - Wikipedia")

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

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

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

[13.2. ConfigParser — 設定ファイルの構文解析器 — Python 2.7ja1 documentation](http://docs.python.jp/2/library/configparser.html "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

```console:
python check_config.py
```
引数の指定が無い場合。
usage()（使い方）を表示。
UNIXコマンドのお約束的作法ですね。

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

```console:
python check_config.py inifile section
```
引数が2つだった場合。
第2引数には、INIファイルのセクション（section）を指定します。
inifileの特定のセクション（section）の内容を表示。

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

```console:
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
```