毎回、いろいろなプログラミング言語について紹介する本連載ですが、今回はデータファイルのYAMLについて紹介します。最近、とにかくYAMLファイルをよく見かけるという開発者のために、YAMLの役割や、その文法について簡単に紹介します。
YAMLって何だろう
汎用データファイルのYAMLは、さまざまな製品の設定ファイルなどで利用されることが増えています。有名なところでは、Kubernetes、Ansible、Docker Compose、GitHub Actionsなど、クラウド環境や開発と運用(DevOps)の現場で設定ファイルとして使われています。言い換えるなら、何か開発したものをクラウドにアップする場面や、自動で変換処理を行ってからリリースしたりする場面で、外すことのできない設定ファイルを記述するのにYAMLが利用されています。
YAMLの特徴は、人間に優しいシンプルな構文でありながら、構造階層を持った複雑なデータを表現できることになります。YAMLのWebサイトによれば、「YAMLはすべてのプログラミング言語で使用できる、人に優しいデータシリアライズ言語」であると解説があります。よく比較されるデータ形式のJSONやXMLと比較しても、読みやすく書きやすいのが特徴です。
YAMLの基本的な文法について
YAMLは設定ファイルを記述するのに便利な機能を十分に備えています。例えば、JSONはシンプルで簡潔にデータ構造を表現できますが、データファイルに必須のコメントなどの機能は備えていません。しかし、YAMLでは、「#」から始まる行を行コメントとして扱えます。データファイルの中に好きなコメントを記述できます。
そして、基本的にYAMLでは、キーと値をペアにして、複数の設定項目を表現できます。単純に「キー: 値」の書式で一行ずつ記述します。例えば、以下はあるユーザーのプロフィールを表現したものです。
# あるユーザーの情報をYAMLで表現したもの
名前: 鈴木
年齢: 22
メール: suzuki@email.com
加えて、リスト型(配列)や、辞書型(マップ)など、構造化されたデータを表現することもできます。下記のように記述しますが、スペースでインデントするというのがポイントです。
# リストの表現
趣味一覧:
- 読書
- 水泳
- 魚釣り
# 辞書型の表現
果物の値段:
リンゴ: 350
バナナ: 180
ミカン: 320
コメントが「#」であること、インデントを利用することなどを考えると、プログラミング言語Pythonと似たところもある気がします。
なお、利便性からインライン表現として、JSON形式とよく似た形式で、リスト型や辞書型を指定できるようにもなっています。そして、YAMLのリスト型や辞書型はネストすることができます。リストの中に辞書型を配置したり、辞書型の中にリストを記述したりできます。
簡単な例で確認してみましょう。JSONのようなインライン表現や、友達一覧の中でリスト型や辞書型をネストして指定しています。
名前: 鈴木
年齢: 25
# リストのインライン表現
趣味: [読書, 水泳, 魚釣り]
# リスト型や辞書型をネストして指定できる
友達一覧:
- 名前: 佐藤
年齢: 22
友達一覧: [{名前: 鈴木, 年齢: 25}, {名前: 山田, 年齢: 30}]
- 名前: 井上
年齢: 19
友達一覧: [{名前: 鈴木, 年齢: 25}]
また、一行に一項目書くようなスタイルですが、複数行の文字列を表現することもできます。次のように「|」と書くと次の行と同じインデントレベルの文字列を複数行の文字列として認識します。
# 複数行の文字列を指定
text: |
一行目のデータ
二行目のデータ
三行目のデータ
PythonでYAMLデータを読む方法
参考までに、PythonでYAMLを読む方法も紹介します。YAMLの読み書きをするには、PyYAMLというパッケージを利用します。Pythonをインストールしている環境で、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、次のコマンドを実行しましょう。
pip install pyyaml
そして、上記のリストや辞書型のネストしたYAMLをprofile.yamlという名前で保存しておきます。そして、次のようなプログラムでYAMLファイルを読み込み、データを表示できます。
# パッケージの宣言
import yaml
# YAMLファイルを読む
with open("profile.yaml", "r", encoding="utf-8") as fp:
data = yaml.safe_load(fp)
# 読み込んだ内容を表示
print(data)
上記のプログラムを「read_yaml.py」という名前で保存しましょう。Pythonのプログラムを実行するには、ターミナルで下記のコマンドを実行します。
python read_yaml.py
FizzBuzz問題の答えをYAMLで表現しよう
それでは、本連載恒例のFizzBuzz問題をYAMLで表現してみましょう。FizzBuzz問題とは次のようなプログラムのことです。
> 1から100までの数字を出力する際に、3の倍数の時「Fizz」、5の倍数の時「Buzz」、3と5の倍数の時「FizzBuzz」と表示するプログラムを作って下さい。
もちろん、YAMLはデータファイルなので、プログラムとして解くことはできないので、上述のPythonを利用してYAMLファイルを生成してみましょう。
import yaml
# FizzBuzzの結果を返す関数
def fizzbuzz(n):
if n % 15 == 0:
return "FizzBuzz"
elif n % 3 == 0:
return "Fizz"
elif n % 5 == 0:
return "Buzz"
else:
return n
def main():
result = {}
for i in range(1, 101):
result[i] = fizzbuzz(i)
# 結果をYAMLファイルへ保存
with open("fizzbuzz_result.yaml", "w") as f:
yaml.dump({"result": result}, f)
if __name__ == "__main__":
main()
上記のプログラムを「fizzbuzz.py」という名前で保存します。そして、ターミナルで「python fizzbuzz.py」を実行すると、「fizzbuzz_result.yaml」というファイルを出力します。そのファイルを開くと次のように表示されます。