Categories: Python

【Python】configparserで設定ファイルを使ってみる

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()メソッドは、指定したoptionkey、またはデフォルト値がなくてもエラーにならず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中のkeyvalueをセットします。

config['User']['name'] = '花子'
print(config['User']['name'])

実行結果

花子

set(section, option, value)

指定されたsection中のoptionvalueで書き換えます。optionvalueは文字列でなければ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

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

5か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago