Python 3.11の新機能tomllibでTOMLのパース

スポンサーリンク

Python 3.11に新機能としてTOML(Tom’s Obvious Minimal Language)のパースがサポートされたので、試してみました。

TOML公式サイトにあるサンプルTOMLを読み込んでみます。

# This is a TOML document

title = "TOML Example"

[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00

[database]
enabled = true
ports = [ 8000, 8001, 8002 ]
data = [ ["delta", "phi"], [3.14] ]
temp_targets = { cpu = 79.5, case = 72.0 }

[servers]

[servers.alpha]
ip = "10.0.0.1"
role = "frontend"

[servers.beta]
ip = "10.0.0.2"
role = "backend"

これをファイルから読み込みます。

import tomllib
from pprint import pprint

# ファイルを開いて読み込み
with open('example.toml', 'rb') as f:
    data = tomllib.load(f)

# 中身を確認
pprint(data)

pprintで中身を確認すると、↑の出力はこのようになっています。

$ python toml.py
{'database': {'data': [['delta', 'phi'], [3.14]],
              'enabled': True,
              'ports': [8000, 8001, 8002],
              'temp_targets': {'case': 72.0, 'cpu': 79.5}},
 'owner': {'dob': datetime.datetime(1979, 5, 27, 7, 32, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=57600))),
           'name': 'Tom Preston-Werner'},
 'servers': {'alpha': {'ip': '10.0.0.1', 'role': 'frontend'},
             'beta': {'ip': '10.0.0.2', 'role': 'backend'}},

servers.alpha, servers.betaのようにドットでテーブルの子テーブルを作れるのが便利そうですね。
JSONには無いdatetime型もサポートされています。

ファイルではなく文字列からのパース版。

import tomllib
from pprint import pprint

toml_str = """
[table]
member1 = 'foo'
member2 = 'bar'
"""

data = tomllib.loads(toml_str)
pprint(data)

↑の出力

$ python toml.py
{'table': {'member1': 'foo', 'member2': 'bar'}}

JSONとの互換性

ちなみに最初の例のTOMLを読み込んだあとJSONで出力しようとすると

TypeError: Object of type datetime is not JSON serializable

JSONにはdatetimeに相当する型が無いためエラーになります。

スポンサーリンク
スポンサーリンク
PythonRecord
シェアする
フォローする

コメント