Pythonで設定ファイルをソースコード内から読み書きする方法を解説します。
configparserモジュールを使うことでINIファイルに似た構造のファイルをソースコード内から簡単に読み書きすることができます。
プログラムの設定などで扱う値を簡単に管理できるようになるのでとても便利です。
それでは、設定ファイルの使い方を見ていきましょう!
設定ファイルについて
設定ファイルには、「INIファイル」に似た構造を持ったファイルを使います。
アプリ内の設定やオプションで自由に変更できる値は、別ファイルに保存してプログラム開始時に毎回読み込んで使います。ちなみに設定ファイルの拡張子は「.ini」です。
設定ファイルの書き方
設定ファイルは、複数のセクションで構成されており、セクション内に「key」と「value」を=またはコロン(:)で繋いで記述します。
[section1] key1 = value1 key2 = value2 key3 = value3 [section2] key4 = value4 key5 = value5 key6 = value6
- セクション名は大文字小文字を区別するが
keyは区別しない - すべての値が文字列として扱われる
コメント
コメントは、「#」または「セミコロン(;)」を使って記述できます。
[section1] key1 = value1 key2 = value2 key3 = value3 # コメントです ; この行もコメントです
valueについて
valueは複数行にわたって記述したり省略することができます。
[section1] key1 = value1 value2 value3 key2 = key3
DEFAULTセクション
あるセクションから存在しない値を取得しようとした時、デフォルト値としてDEFAULTセクションの値を渡すことができます。
例えば、以下のような設定ファイルの場合、Userセクションからgenderキーの値を取得するとDEFAULTセクションのNoneが渡されます。
[DEFAULT] name = 名無し age = -1 gender = None [User] name = 田中太郎 age = 20
デフォルト値を指定したい場合に設定しておきましょう。
設定ファイルの読み込み
適当な設定ファイルを作成してソースコード内から読み込んでみましょう。
今回は以下のconfig.iniを使います。
config.ini
[DEFAULT] name = 名無し age = -1 gender = None [User] name = 田中太郎 age = 20
INIファイルを読み込む
まずは、パーサを生成して使用するINIファイルを読み込みます。
import configparser # パーサの生成 config = configparser.ConfigParser() # INIファイルの読み込み config.read('config.ini')
値を取得
値を取得するには以下の方法があります。
ConfigParser[section][key]
指定した値を文字列として取得します。
print(config['User']['name'])
実行結果
田中太郎
ConfigParser.get(section, option, *, raw=False, vars=None[, fallback])
section引数のoption引数の値を取得します。
print(config.get('User', 'name'))
実行結果
田中太郎
vars引数は、辞書で指定します。指定された場合はvars > section > DEFAULTセクションの順でoptisonが探索される。
print(config.get('User', 'name', vars={'name': 'vars'}))
実行結果
vars
型変換しつつ値を取得
getint()メソッドやgetfloat()メソッド、またはgetboolean()メソッドを使うことで型を変換しつつ値を取得できます。
age = config.getint('User', 'age') print(type(age), age) # 変換できない場合はValueError例外が送出される config.getint('User', 'name')
実行結果
<class 'int'> 20 Traceback (most recent call last): File "main.py", line 5, in config.getint('User', 'name') File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/configparser.py", line 818, in getint return self._get_conv(section, option, int, raw=raw, vars=vars, File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/configparser.py", line 808, in _get_conv return self._get(section, conv, option, raw=raw, vars=vars, File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/configparser.py", line 803, in _get return conv(self.get(section, option, **kwargs)) ValueError: invalid literal for int() with base 10: '田中太郎'
セクションプロキシオブジェクトから取得する
同じセクションから値を取得するには、セクションプロキシオブジェクトを変数に代入してそのオブジェクトを通して値を取得した方が効率的です。
# セクションプロキシオブジェクトを変数に代入 user = config['User'] # userから値を取得する print(user['name']) print(user.getint('age'))
実行結果
田中太郎 20
こちらのget()メソッドは、指定したoptionのkey、またはデフォルト値がなくてもエラーにならずNoneが返される。
user = config['User'] # 存在しないkeyを指定 print(user.get('id'))
実行結果
None
設定ファイルの書き込み
設定ファイルは書き換えることも可能です。
INIファイルを読み込む
まずは、パーサを生成して使用するINIファイルを読み込みます。
import configparser # パーサの生成 config = configparser.ConfigParser() # INIファイルの読み込み config.read('config.ini')
値をセットする
値をセットするには以下の方法があります。値をセットしただけではファイルの値は書き換えられていないので注意してください。書き換える方法は後述します。
ConfigParser[section][key] = value
指定したsection中のkeyにvalueをセットします。
config['User']['name'] = '花子' print(config['User']['name'])
実行結果
花子
set(section, option, value)
指定されたsection中のoptionをvalueで書き換えます。optionとvalueは文字列でなければTypeErrorが発生します。
config.set('User', 'name', '花子') print(config.get('User', 'name'))
実行結果
花子
まとめてセットする
セクションのupdateメソッドを使うか、セクションに辞書を代入することでまとめて値を書き換えることができます。
print(dict(config['User'])) d = {'name': 'Mike', 'age': '40'} # 辞書を代入 config['User'] = d print(dict(config['User'])) d = {'name': 'ジョン', 'age': '8'} # 書き換え config['User'].update(d) print(dict(config['User']))
実行結果
{'name': '田中太郎', 'age': '20', 'gender': 'None'} {'name': 'Mike', 'age': '40', 'gender': 'None'} {'name': 'ジョン', 'age': '8', 'gender': 'None'}
セクションプロキシオブジェクトを使って変更することもできるが、代入すると別オブジェクトになってしまうので注意。
# セクションプロキシオブジェクト user = config['User'] print(f'ID: {id(user)}, 値: {dict(user)}') # updateメソッドならオブジェクトを変えずに値のみ変更できる user.update({'name': 'Mike', 'age': '40'}) print(f'ID: {id(user)}, 値: {dict(user)}') # 代入するとオブジェクトが変わってしまう user = {'name': 'ジョン', 'age': '8'} print(f'ID: {id(user)}, 値: {dict(user)}')
実行結果
ID: 4568320080, 値: {'name': '田中太郎', 'age': '20', 'gender': 'None'} ID: 4568320080, 値: {'name': 'Mike', 'age': '40', 'gender': 'None'} ID: 4568647168, 値: {'name': 'ジョン', 'age': '8'}
書き込む
値をセットしたらwrite()メソッドでファイルに書き込みます。この作業を経て設定ファイルの値が書き換えられます。
# 値をセット config.set('User', 'name', '花子') # ファイルに書き込む with open('config.ini', 'w') as f: config.write(f)
config.ini を確認してみます。
[DEFAULT] name = 名無し age = -1 gender = None [User] name = 花子 age = 20
Userセクションのnameキーの値を書き換えれました。
その他の重要な操作
デフォルト値の取得
defaults()メソッドを使うことでDEFAULTセクションに設定されているにデフォルト値を辞書として取得できます。
print(config.defaults())
実行結果
{'name': '名無し', 'age': '-1', 'gender': 'None'}
セクションの追加・削除
add_sectionメソッドを使うことでセクションを新たに追加できます。
config.add_section('Add') print(config['Add'])
実行結果
<Section: Add>
remove_sectionメソッドを使うことでセクションを削除できる。
config.remove_section('User') print(config['User'])
実行結果
Traceback (most recent call last): File "/Users/user/Desktop/Python/config.py", line 9, in print(config['User']) File "/usr/local/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/configparser.py", line 963, in __getitem__ raise KeyError(key) KeyError: 'User'
要素の削除
remove_optionメソッドを使うことでセクション中のoptionを削除することができます。
config.remove_option('User', 'age') print(dict(config['User']))
実行結果
{'name': '田中太郎', 'age': '-1', 'gender': 'None'}
デフォルト値が設定されているので値が表示されています。ageのデフォルト値が設定されていない場合は以下のようになります。
実行結果
{'name': '田中太郎', 'gender': 'None'}
まとめ
この記事では、Pythonで設定ファイルを読み書きする方法を解説しました。
configparserモジュールを使うことで簡単に設定ファイルを読み書きすることができました。デフォルト値も使えて便利なので是非使ってみてください!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ
- configparser --- 設定ファイルのパーサー — Python 3.9.4 ドキュメント


