設定ファイル (ConfigParser) | Python-izm

設定ファイル

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('ユーザー', '備考'))