プログラミングをしていると、「TOML」という形式のファイルに出会うことがありますよね。
「Cargo.toml」「pyproject.toml」といったファイルを見かけたことはありませんか?「設定ファイルだとは分かるけど、書き方がよく分からない…」と感じている方も多いはずです。
実は、TOMLは人間が読み書きしやすいように設計された、シンプルで明快な設定ファイル形式なんです。JSONやYAMLと比べても、直感的で間違いにくいのが特徴ですよ。
この記事では、TOMLの基本構文から実用的な書き方まで、プログラミング初心者の方にも分かりやすく解説していきます。
実際の例をたくさん見ながら、TOMLの書き方をマスターしていきましょう!
TOMLとは?その特徴を知ろう

TOMLの正体
TOMLは「Tom’s Obvious, Minimal Language」の略称です。
2013年にGitHubの共同創業者であるTom Preston-Werner氏が開発した、設定ファイル専用のデータ形式なんです。
読み方は「トムル」または「トムエル」。日本では「トムル」と呼ぶ人が多いですね。
TOMLが生まれた理由
設定ファイルには、以前から様々な形式がありました。
- INI形式:シンプルだけど機能が少ない
- JSON:厳密だけど人間には読みにくい
- YAML:柔軟だけどインデントが複雑
そこで「もっと読みやすく、書きやすく、曖昧さのない設定ファイル形式を作ろう」という思いから、TOMLが誕生したんです。
TOMLの基本思想
TOMLは以下の3つの原則で設計されています:
1. 明白であること(Obvious)
見ただけで意味が分かる構文
2. 最小限であること(Minimal)
必要最小限のシンプルな文法
3. 人間が読み書きしやすいこと
曖昧さがなく、間違いにくい設計
この思想が、TOMLの全ての文法に反映されているんですよ。
TOMLが使われている場面
主な使用例
TOMLは、様々なプログラミング言語やツールで採用されています。
Rust言語
Cargo.toml:パッケージ管理の設定ファイル
Python
pyproject.toml:プロジェクト設定の標準形式
その他のツール
- Hugo(静的サイトジェネレーター)の設定
- Alacritty(ターミナルエミュレーター)の設定
- Gitの設定ファイル
特にRustのエコシステムでは、TOMLが標準的な設定ファイル形式として定着しています。
なぜ人気なの?
読みやすさ
コメントが書きやすく、設定の意図が伝わりやすい
編集しやすさ
階層構造が明確で、変更や追加がしやすい
エラーが少ない
文法が厳密で、曖昧な解釈がない
学習コストが低い
すぐに理解できるシンプルな構文
これらの理由から、多くの開発者に支持されているんです。
TOMLファイルの基本ルール
ファイル拡張子
TOMLファイルは .toml という拡張子を使います。
例:config.toml、Cargo.toml、pyproject.toml
文字コード
UTF-8エンコーディングが必須です。
ファイルを保存するときは、必ずUTF-8で保存してくださいね。
大文字・小文字の区別
TOMLでは大文字と小文字を区別します。
name と Name は別のキーとして扱われるので注意しましょう。
空白文字
スペースとタブは区別されません。
どちらを使っても構いませんが、一つのファイル内では統一するのがマナーです。
コメントの書き方
基本的なコメント
TOMLでは、# 記号を使ってコメントを書きます。
# これはコメントです
name = "太郎" # 行の途中からでもOK
# 以降、その行の終わりまでがコメントとして扱われます。
複数行コメント
TOMLには複数行コメントの専用構文はありません。
複数行にわたってコメントを書きたい場合は、各行の先頭に # を付けます。
# これは長い説明文です。
# 複数行にわたって書くことができます。
# 各行に # を付ける必要があります。
コメントの活用
設定の意味や注意点を書いておくと、後で見返したときに分かりやすいですよ。
# データベース接続設定
# 本番環境では別の値を使用すること
database_url = "localhost:5432"
キーと値の基本
キー・バリュー・ペア
TOMLの基本は、キー = 値 という形式です。
key = "value"
この形式を「キー・バリュー・ペア」と呼びます。
キーの命名規則
キーには以下のルールがあります:
使える文字:
- 英数字(A-Z、a-z、0-9)
- アンダースコア(_)
- ハイフン(-)
基本的な書き方:
name = "太郎"
user_name = "taro"
max-connections = 100
クォートで囲む書き方:
特殊な文字を含む場合は、クォートで囲めます。
"127.0.0.1" = "localhost"
"キー名" = "日本語のキーも使えます"
ただし、基本的には英数字とアンダースコアだけを使うのが推奨されています。
値の前後の空白
= の前後に空白があってもなくても構いません。
name="太郎" # これもOK
name = "太郎" # これもOK
name = "太郎" # これもOK
ただし、読みやすさのために前後に空白を入れるのが一般的です。
データ型を理解しよう
1. 文字列(String)
文字列は、クォートで囲んで表現します。
基本文字列:
ダブルクォート(")で囲みます。
name = "山田太郎"
message = "こんにちは、世界!"
エスケープシーケンス:
特殊文字は \ でエスケープします。
path = "C:\\Users\\taro\\Documents" # バックスラッシュ
quote = "彼は\"こんにちは\"と言った" # クォート
newline = "1行目\n2行目" # 改行
複数行文字列:
トリプルクォート(""")を使います。
description = """
これは複数行にわたる
長い説明文です。
改行がそのまま保持されます。
"""
リテラル文字列:
シングルクォート(')を使うと、エスケープが不要になります。
windows_path = 'C:\Users\taro\Documents' # エスケープ不要
regex = '<\i\c*\s*>' # 正規表現なども書きやすい
複数行リテラル文字列:
literal_multi = '''
最初の改行は削除されます。
他の改行はそのまま保持されます。
'''
2. 整数(Integer)
整数は、そのまま数字で書きます。
age = 25
max_size = 1000
negative = -42
アンダースコアで区切る:
読みやすくするために、アンダースコアで区切れます。
large_number = 1_000_000 # 100万
hex = 0xDEADBEEF # 16進数
octal = 0o755 # 8進数
binary = 0b11010110 # 2進数
3. 浮動小数点数(Float)
小数点を含む数値です。
pi = 3.14159
temperature = -12.5
指数表記:
scientific = 1e6 # 1,000,000
small = 5e-3 # 0.005
特殊な値:
positive_infinity = inf # 正の無限大
negative_infinity = -inf # 負の無限大
not_a_number = nan # 非数(Not a Number)
4. 真偽値(Boolean)
真偽値は true または false で表現します。
enabled = true
debug_mode = false
注意: 大文字は使えません。True や FALSE は無効です。
5. 日付と時刻
TOMLでは、日時を標準的な形式で表現できます。
日付:
birthdate = 1990-05-15
日付と時刻(オフセット付き):
created_at = 1990-05-15T07:32:00Z
updated_at = 1990-05-15T07:32:00+09:00 # 日本時間
ローカル日時:
local_datetime = 1990-05-15T07:32:00
時刻のみ:
opening_time = 07:32:00
配列(Array)の書き方

基本的な配列
配列は、角括弧([])で囲み、カンマで区切ります。
colors = ["red", "green", "blue"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "two", 3.0] # 異なる型も混在可能
複数行の配列
読みやすくするために、改行して書くこともできます。
fruits = [
"apple",
"banana",
"cherry",
] # 最後のカンマがあってもOK
ネストした配列
配列の中に配列を入れることも可能です。
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
空配列
要素がない配列も定義できます。
empty = []
テーブル(Table)でグループ化
テーブルの基本
テーブルは、関連する設定をグループ化する仕組みです。
角括弧([])でテーブル名を囲みます。
[database]
host = "localhost"
port = 5432
username = "admin"
これは以下のような階層構造を表します:
database
├── host = "localhost"
├── port = 5432
└── username = "admin"
複数のテーブル
ファイル内に複数のテーブルを定義できます。
[server]
host = "127.0.0.1"
port = 8080
host = “localhost” port = 5432
level = “info” file = “/var/log/app.log”
ネストしたテーブル
ドット(.)を使って、階層構造を表現できます。
[server.http]
port = 8080
timeout = 30
port = 8443 certificate = “/path/to/cert.pem”
これは以下の構造を表します:
server
├── http
│ ├── port = 8080
│ └── timeout = 30
└── https
├── port = 8443
└── certificate = "/path/to/cert.pem"
インラインテーブル
短いテーブルは、1行で書くこともできます。
user = { name = "太郎", age = 25, city = "Tokyo" }
ただし、読みやすさを優先して通常のテーブル形式を使うのが推奨されています。
テーブルの配列(Array of Tables)
配列テーブルの書き方
同じ構造のデータを複数定義するときは、二重角括弧([[]])を使います。
[[products]]
name = "りんご"
price = 150
stock = 50
[[products]]
name = "バナナ"
price = 100
stock = 30
[[products]]
name = "オレンジ"
price = 200
stock = 20
これは、3つの製品データを持つ配列を表現しています。
ネストした配列テーブル
配列テーブルの中に、さらに配列を含めることもできます。
[[employees]]
name = "山田太郎"
position = "エンジニア"
[[employees.projects]]
name = "プロジェクトA"
status = "進行中"
[[employees.projects]]
name = "プロジェクトB"
status = "完了"
[[employees]]
name = "佐藤花子"
position = "デザイナー"
[[employees.projects]]
name = "プロジェクトC"
status = "計画中"
この構造は、従業員が複数のプロジェクトを持っている状況を表現しています。
実践的な設定ファイルの例
例1:Webアプリケーションの設定
# アプリケーション全般の設定
name = “MyWebApp” version = “1.0.0” debug = false # サーバー設定
host = “0.0.0.0” port = 8080 workers = 4 # データベース設定
driver = “postgresql” host = “localhost” port = 5432 name = “myapp_db” username = “dbuser” password = “secret123” max_connections = 50 # ログ設定
level = “info” format = “json” output = “/var/log/myapp.log” # キャッシュ設定
enabled = true type = “redis” host = “localhost” port = 6379 ttl = 3600 # 秒単位
例2:Cargo.toml(Rustパッケージ)
[package]
name = "my-rust-project"
version = "0.1.0"
edition = "2021"
authors = ["Taro Yamada <taro@example.com>"]
license = "MIT"
description = "素晴らしいRustプロジェクト"
serde = { version = “1.0”, features = [“derive”] } tokio = { version = “1.0”, features = [“full”] } reqwest = “0.11”
criterion = “0.5”
opt-level = 3 lto = true
例3:pyproject.toml(Pythonプロジェクト)
[project]
name = "my-python-app"
version = "1.0.0"
description = "素晴らしいPythonアプリケーション"
authors = [
{ name = "Taro Yamada", email = "taro@example.com" }
]
requires-python = ">=3.9"
dependencies = [
"requests>=2.28.0",
"numpy>=1.24.0",
"pandas>=2.0.0",
]
dev = [ “pytest>=7.0”, “black>=23.0”, “mypy>=1.0”, ]
requires = [“setuptools>=65.0”, “wheel”] build-backend = “setuptools.build_meta”
line-length = 100 target-version = [“py39”, “py310”, “py311”]
strict = true warn_return_any = true
TOMLとJSON・YAMLの比較
JSONとの違い
JSON:
{
"name": "太郎",
"age": 25,
"hobbies": ["読書", "旅行"]
}
TOML:
name = "太郎"
age = 25
hobbies = ["読書", "旅行"]
TOMLの利点:
- コメントが書ける
- クォートが少なくて読みやすい
- 階層構造が明確
JSONの利点:
- データ交換により適している
- 多くの言語で標準サポート
YAMLとの違い
YAML:
name: 太郎
age: 25
hobbies:
- 読書
- 旅行
database:
host: localhost
port: 5432
TOML:
name = "太郎"
age = 25
hobbies = ["読書", "旅行"]
host = “localhost” port = 5432
TOMLの利点:
- インデントのミスが起きにくい
- 曖昧さがない
- 型が明確
YAMLの利点:
- より簡潔に書ける
- より複雑な構造に対応
よくあるエラーと対処法
エラー1:文字列のクォート忘れ
間違い:
name = 太郎 # エラー!
正しい:
name = "太郎"
文字列は必ずクォートで囲む必要があります。
エラー2:テーブルの重複定義
間違い:
[server]
port = 8080
[server] # エラー!同じテーブル名
host = "localhost"
正しい:
[server]
port = 8080
host = "localhost"
同じテーブルを2回定義することはできません。
エラー3:配列の型混在(同じ階層)
間違い:
array = [1, 2, [3, 4]] # 整数と配列が混在
TOMLでは、配列の要素は基本的に同じ型であることが推奨されています。
正しい:
array = [[1, 2], [3, 4]] # すべて配列
エラー4:キーの重複
間違い:
name = "太郎"
name = "花子" # エラー!
同じキーを2回定義できません。
正しい:
name = "太郎"
nickname = "花子"
TOMLを使いこなすコツ
1. 適切なグループ化
関連する設定は、テーブルでまとめましょう。
悪い例:
db_host = "localhost"
db_port = 5432
cache_host = "localhost"
cache_port = 6379
良い例:
[database]
host = "localhost"
port = 5432
host = “localhost” port = 6379
2. コメントで説明を追加
設定の意図や注意点を書いておきましょう。
# 本番環境では環境変数から読み込むこと
host = “localhost” # 開発環境用 port = 5432 # デバッグモードは本番では必ずfalseに debug = false
3. 一貫した命名規則
キー名の命名規則を統一しましょう。
推奨:スネークケース
max_connections = 100
user_name = "admin"
cache_timeout = 3600
4. 適度に改行を入れる
読みやすさのために、セクション間に空行を入れましょう。
[server]
host = "localhost"
port = 8080
host = “localhost” port = 5432
level = “info”
プログラムからTOMLを読み込む
Pythonでの読み込み
Python 3.11以降は、標準ライブラリで対応しています。
import tomllib
with open("config.toml", "rb") as f:
config = tomllib.load(f)
print(config["server"]["port"])
古いバージョンでは、tomliパッケージを使います。
Rustでの読み込み
Rustでは、tomlクレートを使います。
use std::fs;
use toml::Value;
fn main() {
let contents = fs::read_to_string("Cargo.toml")
.expect("ファイルを読み込めませんでした");
let value = contents.parse::<Value>()
.expect("TOMLのパースに失敗しました");
println!("{:?}", value);
}
JavaScriptでの読み込み
Node.jsでは、@iarna/tomlやtomlパッケージを使います。
const toml = require('@iarna/toml');
const fs = require('fs');
const config = toml.parse(fs.readFileSync('config.toml', 'utf-8'));
console.log(config.server.port);
まとめ
TOMLは、人間が読み書きしやすい設定ファイル形式として設計されています。
この記事のポイント:
- TOMLは明快でシンプルな構文を持つ設定ファイル形式
- キー = 値の基本構造が直感的
- 文字列、整数、浮動小数点、真偽値、日時、配列をサポート
- テーブルで設定をグループ化できる
- 配列テーブルで同じ構造のデータを複数定義可能
- コメントで説明を追加できる
- RustやPythonなど多くの言語で採用されている
TOMLは学習コストが低く、すぐに使い始められます。
JSONのような厳密さと、YAMLのような読みやすさを併せ持った、バランスの良い形式なんです。
プロジェクトの設定ファイルを作るとき、TOMLを選択肢の一つに加えてみてはいかがでしょうか?きっと、その使いやすさに驚くはずですよ!

コメント