設定ファイルの扱いを支援する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: