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に相当する型が無いためエラーになります。
コメント