試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

設定ファイルの扱いを支援するPythonのモジュールについて(ConfigParser)

設定ファイルに対する読み込み/解析/書き込みといった処理を行うのは色々と面倒、という話を「設定ファイルの扱いを支援するPythonのモジュールについて(shlex)」で書いているが、ConfigParserというモジュールは、Windowsの.iniファイルのような書式のファイルに対する読み書きと解析を行う機能を提供している。

コード例

[任意]ファイル名: configparsertest.py

#! /usr/bin/python
# -*- encoding: utf-8 -*-

from ConfigParser import SafeConfigParser
import sys
import os

# DEFAULTセクションの既定値(整数や真偽値も文字列として記述)
default = {"directory" : "/tmp/work",
           "filename" : "test.dat",
           "num" : "100",
           "bool" : "False",}
parser = SafeConfigParser(default)

# このファイルと同じディレクトリのconfigというファイルを使用
configfile = os.path.join(os.path.dirname(__file__), "config")
try:
  f_in = open(configfile, "r")
  parser.readfp(f_in)
  f_in.close()
  print "Info: configfile loaded"
except IOError:
  # 設定ファイルが読めない場合、作成を試みる
  try:
    f_out = open(configfile, "w")
  except IOError:
    # 書けなかったら終了
    print >> sys.stderr, "Error: cannot write file:", configfile
    sys.exit(1)
  # 初期設定を書き込む
  parser.write(f_out)
  f_out.close()
  print "Info: new configfile created"

# 値の操作(セクション名/名前/値)
parser.set("DEFAULT", "filename", "newname.dat")

# 値の表示
print "directory:", parser.get("DEFAULT", "directory")
print "filename:", parser.get("DEFAULT", "filename")  # 操作後の値が表示される
# 整数として取り出して比較に用いるテスト
if parser.getint("DEFAULT", "num") == 100:
  print "num: 100"
# 同様に真偽値として取り出して比較
if parser.getboolean("DEFAULT", "bool") == False:
  print "bool: False"

# 新しい設定を書き込む
try:
  f_out = open(configfile, "w")
except IOError:
  print >> sys.stderr, "Error: cannot write file:", configfile
  sys.exit(1)
parser.write(f_out)
f_out.close()
print "Info: configfile updated"

実行例

このスクリプトを実行すると

Info: new configfile created
directory: /tmp/work
filename: newname.dat
num: 100
bool: False
Info: configfile updated

と表示され、以下の内容の設定ファイルconfigがソースと同じディレクトリに作成される。

[DEFAULT]
directory = /tmp/work
num = 100
bool = False
filename = newname.dat

再びスクリプトを実行すると、このファイルが読み込まれて

Info: configfile loaded
directory: /tmp/work
filename: newname.dat
num: 100
bool: False
Info: configfile updated

のようになる。

覚え書き

  • SafeConfigParserオブジェクトを使用する
  • DEFAULTというセクションでは、値を定義した辞書をSafeConfigParserオブジェクトのコンストラクタ引数に指定することで既定値を設定できる
  • 値を取り出すのはget()、書き込むのはset()というメンバ変数だが、取り出すときには、型を指定できるgetint()getboolean()といったメンバ関数も使える
  • ファイルオブジェクトを指定してファイルから設定を読み込むにはreadfp()、書き込むにはwrite()というメンバ関数を使用
  • DEFAULT以外のセクションはadd_section()で作成でき、セクション操作のメンバ関数も色々あるが、ここでは扱わない・値の読み書きに関してはget()set()の引数の中にセクション名の指定があるため、簡単に扱える
  • ほとんどのメンバ関数の説明はRawConfigParserオブジェクトのところにある

関連記事:

参考URL: