Python

【Python】設定ファイルを使ってみよう【configparser】

この記事では、Pythonで設定ファイルをコード内から読み書きする方法を解説します。configparserモジュールを使うことで、INIファイルに似た構造のファイルを簡単に読み書きすることができます。プログラムの設定などで扱う値を簡単に管理できるようになるのでとても便利です。

設定ファイルについて

設定ファイルにはMicrosoft Windowsの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セクションは特殊なセクションで、他のセクションから設定されていない値を取得しようとした時、デフォルト値として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のkye、またはデフォルト値がなくてもエラーにならず、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()メソッドを使うことで設定されているデフォルト値を辞書で取得できます。

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モジュールを使うことで簡単に設定ファイルを読み書きすることができました。デフォルト値も使えて便利なので是非使ってみてください!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』