YAMLについて
YAMLは "YAML Ain't a Markup Language"(YAMLはマークアップ言語ではない)の頭文字で、ヤムルと発音します。
データ構造を表現する仕様になり、実装は別に各プログラミング言語に対応したものが多数存在しています。
一般的に.yml で終わるファイル名がつけられます。
主に次の用途で使われます。
設定やオプションの定義ファイル
データ交換
ログ
YAMLのデータ構造
YAMLで保持するデータ構造は3つあります。
配列
マッピング(ハッシュ)
スカラー
配列やハッシュのような、他のデータを要素としてもつデータのことを コレクション (Collection) といいます。
それ以外のデータ (数値や文字列など) はスカラー (Scalar) といいます。
YAMLではデータ型は自動判定されます。
整数
浮動小数点
真偽値 (true, yes, false, no)
Null値 (null, ~)
日付 (yyyy-mm-dd)
タイムスタンプ (yyyy-mm-dd hh:mm:ss +-hh:mm) 単引用符(') や 二重引用符(")でくくられた文字列
上記以外は文字列
YAMLの標記
YAMLのデータ構造を表現するルールは表示に単純です。
シャープ記号(#) から行末まではコメントになります。
データの入れ子はインデントで表現
インデントでタブは使わない(使えない)
ハイフォン記号(-)やコロン(:)の次の空白は必須
3つのハイフォン記号(---) はデータの区切りを表す
3つのピリオド記号(...)はそれ以降の読み込みをしない
YAMLでタブを使わない理由は、タブの表示幅は何かの規格で決まっているわけではなく環境によって異なるからです。
配列
配列を表現するためには次のように記述しますが、空白が大事になります。
code: yaml
-sample
-example
これはエラーです。
code: yaml
- sample
- example
これは、Pythonで表現すると ['sample', 'example'] のリストデータとなります。
3つのハイフォン記号(---) はデータの区切りを表します。
複数のデータを1つのファイルで保持することができます。
code:yaml
- sample
- example
----
- simple
- dimple
これは、Python で表現すると ['sample', 'example'] 、['simple','dimplpe'] の2つのリストデータとなります。
3つのハイフォン記号(---) はデータの開始という意味もあるため、
YAMLの先頭に書かれることもあります。
3つのピリオド記号(...) があればそれ以降読み込むことをしません。
デバッグのときなどに使えます。
code: yaml
- sample
- example
...
- dimple
これは、Python で表現すると ['sample', 'example'] のリストデータとなります。
入れ子の例です。
インデントではタブは使えません。慣習的に空白2つでインデントします。
code:yaml
- sample
- apple
- simple
- example
これは、Python で表現すると ['sample', ['apple', 'simple'], 'example'] のリストデータとなります。
マッピング(ハッシュ)
マッピングはハッシュと言われることもあり、Key: Value 形式で表現します。
コロンの次には空白文字が必須です。
値がない場合は、入れ子のデータ構造となります。
code: yaml
dbname: sample
dbuser: admin
dbpass: admin.admin
これは、Python で表現すると{'dbname': 'sample', 'dbuser':'admin', 'dbpass':'admin.admin'} の辞書データとなります。
code: yaml
dbspec:
dbname: sample
dbuser: admin
これは、Python で表現すると{'dbspec':{'dbname': sample, 'dbuser': 'admin'}} の辞書データとなります。
YAMLでの改行の扱い
YAMLでは改行の扱いは標記方法によって変わってきます。
code: yaml
# 改行は空白文字に置き換えられる
sample1:
aaa
bbb
## 最終行の改行だけを保持し、それ以外は空白文字に置き換えられる
sample2: >
aaa
bbb
## 最終行とそれに続く改行を保持して、それ以外の改行を空白文字に置き換える
sample3: >+
aaa
bbb
## 最終行の改行を取り除き、それ以外の改行は空白文字に置き換える
sample4: >-
aaa
bbb
# 各行の改行を保持する。
sample5: |
aaa
bbb
## 各行の改行と、最終行に続く改行を保持する
sample6: |+
aaa
bbb
## 最終行の改行は取り除き、それ該改行は保持する
sample7: |-
aaa
bbb
このデータを次のコードで読み込んでみましょう。
code: python
import yaml
with open('data.yml','r+') as file:
data = yaml.load(file)
for key, val in data.items():
print(">= %s - %s" % (key, val))
出力は次のようになります。
code: output
= sample1 - aaa bbb
= sample2 - aaa bbb
= sample3 - aaa bbb
= sample4 - aaa bbb
= sample5 - aaa
bbb
= sample6 - aaa
bbb
= sample7 - aaa
bbb
アンカーとエイリアス
YAMLではデータをアンド記号(&)で定義しておき(アンカー)、アスタリスク記号(*) で再利用する(エイリアス)ことができます。
言葉よりも、表記方法を見る方が理解が早いはずです。
code: yaml
&sample simpe
apple
*sample
*sample
これは、Python で表現する ['simple','apple','simple','simple'] のリストデータとなります。
マッピングの結合
マッピングは << で結合させることができます。
前述のアンカーとエイリアスを組み合わせると、繰り返されるデータが非常に簡単に定義できるようになります。
code: yaml
dbcommon: &dbcommon
dbuser: admin
dbpass: admin.admin
development:
dbname: sample_dev
<<: *dbcommon
production:
dbname: sample
<<: *dbcommon
Python での応用例
Python では PyYAML ほか多数の実装があります。 少し変わったところで、YAML形式で記述した設定ファイルを読み書きするための yaml-config といった実装もあります。 参考資料