設定ファイル(iniファイル)を扱うConfigParserモジュールについて調べてみました。
###INIファイルとは
- Windows の設定ファイルとして考案された
- Windows以外でも設定ファイルのフォーマットとして利用される
- テキスト形式
- 容易に編集が可能(ぶっ壊すのも簡単)
- 拡張子には「.ini」が付く。
- セクション、キー、キー項目(プロパティ)から構成される
###Python におけるINIファイルの扱い
Python には標準でINIファイルの読み書きができるモジュール、ConfigParserが用意されています。
13.2. ConfigParser — 設定ファイルの構文解析器 — Python 2.7ja1 documentation
サンプル Python2版(check_config.py)
で、サンプルとして作ったのが次のツールです。Python 2.7で実行。
#!/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文が変わった
- 文字コードの扱いが変わった
#!/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