TOMLの扱い
Table of contents
近年設定ファイルのフォーマットなどで読み書きしやすいということで採用が増えている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
であることに注意。 pickle
や json
と同じように 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"
"""