Python

Pythonを使ったTOMLの使い方とTOMLの書き方を詳しく解説

2021年9月15日

Pythonを使ったTOMLの操作

アプリケーションを作る際に設定ファイルを作成しますが、みなさんはどのような形式で作成していますか?

INIファイルですか?

それともJSONやYAMLファイルでしょうか?

TOMLは人が読みやすいように作られているので、直感的にJSONやYAMLより設定ファイルとして結構使いやすいと感じました。

この記事では、TOMLの書き方とPythonで利用するための使い方を解説しています。

他にもPythonでいろいろなファイルの読み書きを解説しています。

ご興味があれば、下記の記事もご覧ください。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

TOMLとは

TOMLとは

TOMLとは設定ファイルの種類で、読みやすいフォーマットとなるように設計されています。

INIファイルの構文より、仕様が定義されている。

さまざまなプログラミング言語でもカンタンに解析でき、よっていろいろな言語で利用されています。

TOMLは、YAMLJSONなどのデータのシリアル化に使用される他のファイル形式と特徴を共有しています。

そのため、JSONのようにシンプルで、YAMLのように人が読みやすいようにできています。

よってTOMLは3つの特徴からなります。

特徴

  • 人間が読みやすい
  • さまざまなタイプを指定できる
  • 多数のプログラミング言語のサポート
PythonでConfigParserの使い方
PythonのConfigParserを使ったINIファイルの操作
PythonでINIファイルを操作してみます。 ここでいうINIファイルはWindowsのINIファイルではなく、あくまでの似た構造のINIファイルの操作になります。 PythonでINIファイルを操作するために、ConfigParserを ...

続きを見る

PythonによるYAMLの使い方
Pythonを使ったYAMLの使い方を解説
Pythonを使ってYAMLの使い方について解説します。 YAMLは、DockerやKubernetesといったコンテナオーケストレーションツールで利用されています。 書き方や使い方がわからない方に対して、PyYAMLの使い方を含め解説して ...

続きを見る

PythonによるJSONファイルの操作
Pythonを使ったJSONファイルを操作!読み込みから書き込みまでの基本操作を解説
Pythonを使ったJSONの操作ついて解説します。 この記事では、Python標準のjsonモジュールとGeoJSONについて説明しています。 simplejsonについてはPython標準のモジュールと使い方は同じなので、興味がある方は ...

続きを見る

TOMLの書き方

TOMLの書き方

TOMLの書き方については、公式サイトのクイックツアーをみても非常にカンタンです。

公式サイトも日本語に対応していて、カンタンに仕様がわかります。

ファイルの拡張子は、「.toml」とつける必要があります。

MIMEタイプは、「application/toml」になります。

コメントアウトの書き方

コメントの書き方は、#(ハッシュ記号)に続けて書きます。

ただし、#を文字列として含めたい場合は、ダブルクォーテーションで括ります。

# サンプルTomlのコメント(これはコメントアウト)
sample = "#これはコメントアウトにならない"

キーと値の書き方

値の書き方については、INIファイルの書き方と同じです。

左辺にキーを指定し、イコールを使って右辺に値を書きます。

キーで利用できるのは、アルファベットの大文字のAからZ、小文字のaからzと0から9の数字とアンダースコアとハイフンになります。

他にもドットやダブルやシングルクォーテーションで囲んだキー名をつけることができます。

key = "値"
"key" = "値"
sample.key1 = 1
sample.key2 = 2

値については型があり、それ以外だと不正になります。

複数回同じキーを定義してはいけない

文字列

値をダブルクォーテーションで囲みます。

key = "文字列"

整数

整数の場合、プラス(+)とマイナス(ー)の符号をつけることができます。

プラスの場合は、省略しても問題ありません。

key1 = 10
key2 = +10
key3 = -10

他にもアンダースコア(_)をつけることができます。

これは、大きい数字を読みやすくするためです。

カンマ区切りができないので、アンダースコアで対応しても良いかもしれないですね。

key1 = 1_000
key2 = 10_00
key3 = 1_0_0_0

3番目の書き方については問題ないのですが、公式では推奨していない書き方のようです。

浮動小数点

小数点もプラス(+)とマイナス(ー)をつけることができます。

プラスについては、省略することが可能です。。

key1 = +5.5
key2 = 5.55
key3 = -5.55

指数表記や複合表記も可能ですが、あんまり使いそうにないので省略します。

論理値

TrueとFalseになりますが、Pythonでは頭文字が大文字ですがTOMLだと全て小文字のみになります。

key1 = true
key2 = false

日付

日付には、何個か書き方があります。

一つ目が、オフセット付きの日付です。

これは、RFC3339表記のオフセット付き日時を使います。

datetime1 = 2021-09-14T21:14:00Z
datetime2 = 2021-09-14T21:14:00-07:00
datetime3 = 2021-09-14T21:14:00.999999-07:00

Tの代わりに空白文字のスペースにすることも可能です。

上記は、タイムゾーンまで指定していましたが、下記はタイムゾーンの指定なしのローカルの日時の書き方になります。

datetime1 = 2021-09-14T09:00:00
datetime2 = 2021-01-29T00:12:35.999999

日付だけを書くこともできます。

date = 2021-09-10

ほかにも時間だけの場合もOKです。

time1 = 07:52:59
time2 = 23:59:59.999999

配列

配列の定義の仕方は、Pythonのリストと同じように角かっこで記載します。

配列の値は、利用できる全ての型を使うことができます。

keys = [1, 2, 3]
names = ["太郎", "次郎", "サブロー"]
str_to_int = [1, 2, 3, "first", "second", "third"]

改行で複数行にして書くことも可能です。

names = [
  "太郎", 
  "次郎",
  "サブロー"
]

テーブル

テーブルは、キーと値の集まりです。

INIファイルでいう、グループの役割になります。

テーブルが出ると、次のテーブルまたはファイルの終了までが、そのテーブルの宣言内になります。

[table]
key = "tableの値です"

[table2]
key = "table2の値です"

テーブル名の命名規則は、キーの命名規則と同じです。

[staffs.user]
profile.nickname = "ニック"
profile.age = 30

上記のTOMLは下記のJSONと同じです。

{
  "staffs": {
    "user": {
      "profile": {
         "nickname": "ニック",
         "age": 30,
      }
    }
  }
}

インライン・テーブル

インライン・テーブルは、波かっこ{ と }で囲みます。

name = { first = "Python", last = "太郎" }

インラインテーブルは、1行で表現されるべきと公式にあります。複数行にする場合は、普通のテーブルを利用するべきです。

テーブルの配列

テーブルを配列にするには、角かっこを2つ並べます。

[[array]]

未定義

未定義の値は不正になります。

key = 
key = # これもNG

TOMLモジュールの使い方

TOMLモジュールの使い方

python-tomlは開発が止まっているようだったので、tomlというライブラリをインストールします。

どちらも開発が止まってるがGithubのスターの数もtomlの方が多いので、こちらを紹介します。

tomlモジュールのインストール

インストールするには、pipコマンドを利用してインストールします。

$ pip install toml

下記のようにSuccessfullyが表示されればインストール完了です。

Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB)
Installing collected packages: toml
Successfully installed toml-0.10.2

TOMLファイルの読み込み

TOMLファイルを読み込むために、設定ファイルっぽくTOMLファイルを作成してみました。

app = "サンプル"
version = "1.0"

[setting]
env = "dev"
    [web]
        type = "nginx"
        host = "localhost"
        port = 5000
    [db]
        type = "pg"
        host = "localhost"
        port = 5432

[master]
account = "admin"
password = "admin"

単純にこのTOMLファイルを読み込んでみます。

import toml

with open('./sample.toml') as f:
    obj = toml.load(f)
    print(obj)

読み込み方は、普通にwithでファイルを読み込みます。

読み込んだストリームを使って、toml.loadに入れます。

toml.loadがTOMLファイルとして読み込む関数になります。

結果は下記になります。

{'app': 'サンプル', 'version': '1.0', 'setting': {'env': 'dev'}, 'web': {'type': 'nginx', 'host': 'localhost', 'port': 5000}, 'db': {'type': 'pg', 'host': 'localhost', 'port': 5432}, 'master': {'account': 'admin', 'password': 'admin'}}

dumpsを使ってTOMLにエンコード

loadを使うことでTOMLデータをデコードしていましたが、dumpsを使うことでPythonオブジェクトをTOMLデータにエンコードします。

読み込みで使ったTOMLファイルと読み込みファイルをそのまま利用して、dumpsを追加します。

import toml

with open('./sample.toml') as f:
    obj = toml.load(f)
    data = toml.dumps(obj) # ここに追加
    print(data)

普通はオブジェクトにして、データの追加や変更、削除といったことを行なってdumpsでTOMLデータに戻してファイルに書き込むといったことをやります。

下記が出力された内容になります。

app = "サンプル"
version = "1.0"

[setting]
env = "dev"

[web]
type = "nginx"
host = "localhost"
port = 5000

[db]
type = "pg"
host = "localhost"
port = 5432

[master]
account = "admin"
password = "admin"

TOMLファイルの新規作成

TOMLファイルの新規作成は、2つの方法があります。

ひとつは、dumpsを使ってストリームのwrite関数を使って書き込む方法です。

もうひとつは、dumpを使ってファイルを書き込む方法です。

まずは、writeを使った書き方です。

import toml.encoder

with open('write_sample.toml', 'w') as f:
    data = {
        'app': 'テスト書き込み'
    }

    obj = toml.dumps(data)
    f.write(obj)

次に、dumpを使った書き方です。

import toml.encoder

with open('write_sample.toml', 'w') as f:
    data = {
        'app': 'テスト書き込み'
    }

    toml.dump(data, f)

この辺は、どれを使うか好みによると思います。

実際、dumpで行なっている処理はdumps使ってwriteしてるのでどれ使っても同じです。

まとめ

Pythonを使ってTOMLを操作するために、読み込みと書き込みついて説明しました。

他のYAMLINIJSONといったファイル関連の処理とほとんど操作性は同じになります。

TOMLは、上記のファイルのいいとこ取りしたファイル形式なので、機会があればアプリケーションの導入に検討してみるのも良いかもしれません。

他にもPythonでいろいろなファイルの読み書きを解説しています。

ご興味があれば、下記の記事もご覧ください。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

Udemyへ

今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?

-Python
-,