Pythonにはとても便利な設定ファイル読み書き機能があります。決められた書式に従って記述することで、容易に設定値を得ることができます。
設定ファイルの読み込み
Windowsのiniファイルのような構造で保存します。まずは設定ファイルそのものを作ってみましょう(文字コードはUTF-8です)。
# コメントアウトも出来ます [settings] host = localhost port = 12345 # 「 = 」前後にスペースがあってもなくても問題なし [system] os=Windows version=8 path= # 区切りは「 = 」でも「 : 」可 [user] name : python-izm password : 0000 mail : mail@example.com
ハイライトされている部分がセクションで、セクション名を「 [] 」(大カッコ)で囲みます。セクション配下にオプション名=値という書式でエントリを追加していく形です。config.iniというファイル名で作業ディレクトリへ保存しましょう(ファイルの拡張子はiniでなくても構いません)。
次は読み込みです。
※Python 2系と3系で異なります。
Python 3系
import configparser inifile = configparser.ConfigParser() inifile.read('./config.ini', 'UTF-8') print(inifile.get('settings', 'host')) print(inifile.get('settings', 'port')) print(inifile.get('system', 'os')) print(inifile.get('system', 'version')) print(inifile.get('system', 'path')) print(inifile.get('user', 'name')) print(inifile.get('user', 'password')) print(inifile.get('user', 'mail'))
Python 2系
# -*- coding: utf-8 -*- import ConfigParser inifile = ConfigParser.SafeConfigParser() inifile.read('./config.ini') print inifile.get('settings', 'host') print inifile.get('settings', 'port') print inifile.get('system', 'os') print inifile.get('system', 'version') print inifile.get('system', 'path') print inifile.get('user', 'name') print inifile.get('user', 'password') print inifile.get('user', 'mail')
localhost 12345 Windows 8 python-izm 0000 mail@example.com
configparserモジュールよりConfigParserクラスを使用します(2系ではConfigParserモジュール、SafeConfigParserクラス)。readの引数でファイルパス(3系では文字コードも)を指定し、設定ファイルの読み込みを行っています。
import configparser inifile = configparser.ConfigParser() inifile.read('./config.ini', 'UTF-8') print(inifile.get('settings', 'host')) print(inifile.get('settings', 'port')) print(inifile.get('system', 'os')) print(inifile.get('system', 'version')) print(inifile.get('system', 'path')) print(inifile.get('user', 'name')) print(inifile.get('user', 'password')) print(inifile.get('user', 'mail'))
getの引数に、セクション名とオプション名を指定してください。それに対応した設定値が返されます。
import configparser inifile = configparser.ConfigParser() inifile.read('./config.ini', 'UTF-8') print(inifile.get('settings', 'host')) print(inifile.get('settings', 'port')) print(inifile.get('system', 'os')) print(inifile.get('system', 'version')) print(inifile.get('system', 'path')) print(inifile.get('user', 'name')) print(inifile.get('user', 'password')) print(inifile.get('user', 'mail'))
ファイル内に日本語が含まれる場合
Python 2系では
設定ファイル内に日本語(マルチバイト文字列)を含む場合はエンコードに気を付けなければなりません(特にPython 2系の場合)。config.ini は先の例と同様にUTF-8で保存してください。
[ユーザー] name = python-izm name_kana = ぱいそんいずむ 備考 = 管理者ユーザー
Python 2系
# -*- coding: utf-8 -*- import ConfigParser inifile = ConfigParser.SafeConfigParser() inifile.read('./config.ini') print inifile.get('ユーザー', 'name') print unicode(inifile.get('ユーザー', 'name_kana'), 'UTF-8') print unicode(inifile.get('ユーザー', '備考'), 'UTF-8')
python-izm ぱいそんいずむ 管理者ユーザー
例示の設定ファイルでは、セクション名とオプション名に日本語が含まれるものがあります。これらを取得する際に u’ユーザー’ のような指定をしないように注意しましょう。ConfigParser.NoSectionError が発生します。
Python 3系では
Python 3系では特に気を付けて行う必要はありません。次のようなコードで同様の結果が得られます。
Python 3系
import configparser inifile = configparser.ConfigParser() inifile.read('./config.ini', 'UTF-8') print(inifile.get('ユーザー', 'name')) print(inifile.get('ユーザー', 'name_kana')) print(inifile.get('ユーザー', '備考'))