Python configparserのget()とは?値を型付きで取り出す方法

get()とその仲間は、設定ファイルの値を型付きで取り出すメソッドです。

INIの値はすべて文字列なので、数値や真偽値として使うには変換が必要です。


値は必ず文字列

import configparser

c = configparser.ConfigParser()
c.read("config.ini")

port = c["server"]["port"]
print(repr(port), type(port).__name__)

実行結果:

'8080' str

8080と書いてあっても文字列の'8080'です。

これに気づかないと、port + 1でTypeErrorになったり、if debug:が常に真になったりします。


4つの取得メソッド

print(c.get("server", "host"))
print(c.getint("server", "port"))
print(c.getfloat("server", "timeout"))
print(c.getboolean("server", "debug"))

実行結果:

localhost
8080
30.0
True
メソッド 戻り値の型
get() str
getint() int
getfloat() float
getboolean() bool

引数は「セクション名, キー名」の2つです。角括弧で書くc["server"]["port"]と同じ場所を指します。


getbooleanが受け付ける値

for v in ["yes", "no", "true", "false", "on", "off", "1", "0"]:
    c["t"] = {"v": v}
    print(f"{v!r:8} -> {c.getboolean('t', 'v')}")

実行結果:

'yes'    -> True
'no'     -> False
'true'   -> True
'false'  -> False
'on'     -> True
'off'    -> False
'1'      -> True
'0'      -> False

大文字小文字は区別されません。YESもTrueも同じように扱われます。

一方で、それ以外の値はエラーになります。

c["t"] = {"v": "はい"}
c.getboolean("t", "v")

実行結果:

ValueError: Not a boolean: はい

なおbool("false")はTrueになります。空でない文字列はすべて真だからです。

bool()で変換してはいけません。必ずgetboolean()を使ってください。


無いときの例外

c.get("server", "zzz")

実行結果:

configparser.NoOptionError: No option 'zzz' in section: 'server'
c.get("zzz", "a")

実行結果:

configparser.NoSectionError: No section: 'zzz'

キーが無い場合とセクションが無い場合で例外が違います。どちらもKeyErrorではありません。

角括弧で書いた場合はKeyErrorになります。書き方によって例外が変わる点に注意してください。


fallbackで既定値を渡す

print(c.get("server", "zzz", fallback="既定値"))
print(c.getint("server", "retry", fallback=3))

実行結果:

既定値
3

設定が任意項目のときに便利です。tryで囲む必要がなくなります。

すべてのget系メソッドで使えます。

ただし必須の設定にfallbackを付けてはいけません。書き忘れに気づけなくなります。


DEFAULTからも取れてしまう

print(c.get("database", "timeout"))

実行結果:

30

[database]にtimeoutは書かれていませんが、[DEFAULT]から引き継がれています。

そのためfallbackが使われないことがあります。

print(c.get("database", "timeout", fallback="99"))

実行結果:

30

「DEFAULTに書いた覚えがない値が返る」と感じたら、[DEFAULT]セクションを確認してください。


存在を確認する

print("server" in c)
print(c.has_section("server"))
print(c.has_option("server", "host"))
print(list(c["server"]))

実行結果:

True
True
True
['host', 'port', 'debug', 'timeout']

最後の行にtimeoutが含まれています。これも[DEFAULT]からの継承です。

セクションに直接書かれたキーだけを見たい場合は、c["DEFAULT"]のキーを除外する必要があります。


get系のまとめ

  • INIの値はすべて文字列
  • getint()・getfloat()・getboolean()で変換
  • getboolean()はyes/no/on/off/1/0に対応
  • bool()で変換してはいけない("false"も真になる)
  • 例外はNoOptionErrorとNoSectionError
  • 任意項目にはfallback——必須項目には付けない
  • [DEFAULT]の継承でfallbackが効かないことがある

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら