カネキン伊藤テック

TOMLの扱い

近年設定ファイルのフォーマットなどで読み書きしやすいということで採用が増えているTOML(Tom’s Obvious Minimal Language)をPythonで扱う方法を紹介。Python 3.11以降のバージョンでは tomllib ライブラリが標準で組み込まれているので外部ライブラリをインストールしなくても import tomllib することでTOML処理のためのルーチンが簡単に利用できる。( tomllib はparse/読み込み機能だけであることに注意)

TOMLの読み込み

TOMLの読み込みは3.11以降標準の tomllib を使うと簡単に読み込むことができる。ファイルライクオブジェクト( read() を実装したオブジェクト)から読み込む場合は tomllib.load() を, 文字列から読み込む場合は tomllib.loads() を使う。

# サンプルtomlファイル
"""
aaa = 123
bbb = "hoge"

[ccc]
c_a = [ "c_a1", "c_a2" ]
c_b = { x = 999, y = 888 }

[ddd.eee]
d_e_f = true
"""

# tomlが書き込まれたファイルから構造を取得( load() を使う)
import tomllib  # Python 3.11 以降でしか使えないことに注意
try:
	with open("sample.toml", "rb") as fh:  # モード rb に注意
		data = tomllib.load(fh)
except tomllib.TOMLDecodeError:
	# 必要なければtry-exceptはなくてもよい
	print("decode error!")

"""
data の中身:

{'aaa': 123,
 'bbb': 'hoge',
 'ccc': {'c_a': ['c_a1', 'c_a2'], 'c_b': {'x': 999, 'y': 888}},
 'ddd': {'eee': {'d_e_f': True}}}
"""

# 文字列からTOMLをパース( loads() を使う)
my_toml = """
a = "moji"
b = 123
c = ["hello", "world"]
d = { x = 34.5, y = 45.6, z = 45.6 }
e = true
"""
parsed = tomllib.load(my_toml)

"""
parsedの中身:

{'a': 'moji',
 'b': 123,
 'c': ['hello', 'world'],
 'd': {'x': 34.5, 'y': 45.6, 'z': 45.6},
 'e': True}
"""

TOMLの書き込み

Python 3.11以降に標準で組み込まれている tomllib パッケージには構造化データをTOML形式で書き出す実装がないのでTOML形式でデータを出力したい場合は外部パッケージを使う必要がある。 ここでは Tomli-W パッケージを紹介する。

Tomli-W パッケージは以下のようにしてインストールできる。

$ pip install tomli-w

import するパッケージ名は tomli_w であることに注意。 picklejson と同じように dumps() 関数で構造化データをシリアライズできる。

import tomli_w

data = {
	"a": "hello",
	"b": "world",
	"c": 123,
	"d": True,
	"e": ["x", "y", "z"],
	"f": {
		"g": {
			"g1": 1,
			"g2": 2,
			"g3": 3
		}
	},
	"i": {
		"j": "jjj",
		"k": "kkk"
	}
}

print(tomli_w.dumps(data))

"""
出力結果:

a = "hello"
b = "world"
c = 123
d = true
e = [
    "x",
    "y",
    "z",
]

[f.g]
g1 = 1
g2 = 2
g3 = 3

[i]
j = "jjj"
k = "kkk"
"""

参考リンク