今日も見に来てくださって、ありがとうございます。すっかり春めいてきましたね。
Pythonでツールとかゲームを作りたいな、と、思ったときに必要になってくる設定ファイルって、どうしたらいいでしょう。ざっと考えただけでもいろんな選択肢があったのですが、ぼくの環境はWindows10ですので、Windowsスタイルの.iniファイルに保存して、読み書きするのがよさそうですね。ということで、標準モジュールのconfigparserを使ってみたいと思います。詳細はここに説明がありました。
読み込み方法
まずは、試しにファイルを開いてみたいと思います。普段よく使っているサクラエディタのフォルダに.iniファイルがありましたので、そちらを見てみたいと思います。以下のスクリプトを実行してみます。
from configparser import ConfigParser cfg = ConfigParser() cfg.read("C:\Program Files (x86)\sakura\sakura.exe.ini") for s in cfg.sections(): print("["+s+"]") print(cfg.options(s)) for o in cfg.options(s): print(o, cfg.get(s,o), cfg[s][o])
Anaconda Promptからpython
コマンドを実行、その後スクリプトを実行しました。
1行目、configparse
モジュールのConfigParser
クラスをインポートしています。これで設定パーサーが使えるようになります。パーサーとは、構文解析を行うためのプログラムの総称です。今回のConfigParser
は設定ファイルの構文を読み込んで利用できるようにしてくれます。
3行目で、クラスのインスタンスを作成して、4行目で.iniファイルを読み込んでいます。
セクションは、.iniファイルの中に[section]
形式で指定された値です。5行目にあるように、cfg.sections()
を実行することでセクション文字列のリストが取得できます。結果から、サクラエディタでは「Settings」というセクションが一つだけ設定されていることがわかります。
セクションの中には、「=」で区切られたキーと値があります。6、7行目にあるように、cfg.options(s)
とセクションを指定することでそのセクションのキー一覧が取得できます。注意点は、セクションは大文字小文字を区別するけど、オプションのキーは区別しない、ということでしょうか。
値の取得方法は、いくつかありますが、簡単な方法として、二つ使ってみました。9行目の、cfg.get(s, o)とcfg[s][o]です。いずれもセクションとオプション(キー)を指定することで、値を取得できます。辞書のように使うことができるのでとっても便利ですね。
設定ファイルの作成、書き込み
読み込みができたので、今度は書き込みです。test.iniファイルを新しく作成してみます。
cfg = ConfigParser() cfg.add_section("NewSection1") cfg.set("NewSection1", "Option1", "Value1") cfg.set("NewSection1", "Option2", "Value2") cfg["OtherSection2"] = {"Option3":"Value3", "Option4":"Value4"} with open("test.ini","w") as fp: cfg.write(fp)
実行すると、test.iniファイルが出来上がりました。
[NewSection1] option1 = Value1 option2 = Value2 [OtherSection2] option3 = Value3 option4 = Value4
サンプルとして二つの設定の仕方を試してみました。
1行目:まずはConfigParser
のインスタンスを作成します。
2~4行目:add_section
でセクションを追加して、追加したセクションにオプションをふたつセットしています。
5行目:辞書と同じ形式でセクションをセット、同時に別の辞書を使ってオプションを二つ追加しています。
6~7行目:最後にtest.iniファイルへ作成した値を保存しています。
おまけ
これで、設定ファイルの読み込みと書き込みができるようになったのですが、これだと設定ファイル中のコメントが消えてしまうのですよね。まるっきり上書きですからね。ちょっと調べてみるとコメントを書くためのテクニックがありました。以下のスクリプトの通りです。
cfg = ConfigParser(allow_no_value=True) cfg.add_section("SampleSection") cfg.set("SampleSection","; これはセクションのコメントです。") cfg.set("SampleSection","Option4", "Value4") with open("test2.ini","w") as fp: fp.write("; これは全体のコメントのテストです。\n\n") cfg.write(fp)
実行結果のtest2.iniファイルの内容です。
; これは全体のコメントのテストです。 [SampleSection] ; これはセクションのコメントです。 option4 = Value4
ポイントは、1行目の「allow_no_value=True
」をセットすることと、3行目のオプションの最初の文字を「;(セミコロン)」にしておく、ということですね。また全体のコメントを追加するためには、7行目のように、設定内容を書き込む直前にコメントを出力すればよいですね。
他に、コメント文字は「#」、キーバリューの区切り文字に「:」も初期値として利用可能です。これらの値はConfigParserのインスタンスを作成するときに変更することができます。
まとめ
設定ファイルの読み書きに、configparserが利用できます。コメント付きの設定ファイルの読み書きをしたいときには、ちょっとした工夫が必要です。