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
は複数行にわたって記述したり省略することができます。
[section1]
key1 = value1
value2
value3
key2 =
key3
あるセクションから存在しない値を取得しようとした時、デフォルト値として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ファイルを読み込みます。
import configparser
# パーサの生成
config = configparser.ConfigParser()
# INIファイルの読み込み
config.read('config.ini')
値を取得するには以下の方法があります。
指定した値を文字列として取得します。
print(config['User']['name'])
実行結果
田中太郎
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ファイルを読み込みます。
import configparser
# パーサの生成
config = configparser.ConfigParser()
# INIファイルの読み込み
config.read('config.ini')
値をセットするには以下の方法があります。値をセットしただけではファイルの値は書き換えられていないので注意してください。書き換える方法は後述します。
指定したsection
中のkey
にvalue
をセットします。
config['User']['name'] = '花子'
print(config['User']['name'])
実行結果
花子
指定された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/python@3.9/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モジュールを使うことで簡単に設定ファイルを読み書きすることができました。デフォルト値も使えて便利なので是非使ってみてください!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ
View Comments