Python

Pythonを使ったYAMLの使い方を解説

2021年9月11日

PythonによるYAMLの使い方

Pythonを使ってYAMLの使い方について解説します。

YAMLは、DockerやKubernetesといったコンテナオーケストレーションツールで利用されています。

書き方や使い方がわからない方に対して、PyYAMLの使い方を含め解説しています。

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

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

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

続きを見る

YAMLとは

YAMLとは

YAMLは、オブジェクトを文字列にシリアライズしたデータ形式の一種とのことです。

ウィキペディアからの一文なのですが、よくわからん。

とりあえず、XMLやJSON、TOMLといった構造化したデータをもつ、データ形式と同じ種類と思っても良いです。

特徴としては、XMLやJSONなどと同じくテキストとして読むことができます。

YAMLの書き方

YAMLの書き方について

YAMLの書き方として特徴的なものが、インデントを使って階層構造を表現します。

Pythonを使ってたらわかると思いますが、Pythonでもインデントを使ってブロックを表現しています。

そのため、YAMLでも似たような書き方になります。

タブの禁止

インデントを使って階層構造を表現しますが、タブスペースを利用することはできません。

利用できるのはスペースになります。

profile:
  nickname: ニックネーム

コメントアウト

コメントの書き方は、#(ハッシュ記号)を使います。

# name: 太郎 

連想配列

同一階層で、複数のキーと値を設定する方法です。

Pythonだと連想配列にピンと来ない場合は、辞書型だと思ってください。

name: 太郎
age: 20

リスト

リストについては、下記の形で先頭行にハイフン(ー)をつけます。

member:
 - 太郎
 - 次郎
 - 三郎

PyYAMLの使い方

PyYAMLの使い方

PyYAMLは、Python版のYAMLパーサーになります。

YAML1.1のパーサーやUnicodeのサポートなどを行なっています。

PyYAMLのインストール

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

$ pip install PyYAML

インストールが成功すると下記のようにSuccessfullyが表示されます。

Collecting PyYAML
  Downloading PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl (259 kB)
     |████████████████████████████████| 259 kB 2.4 MB/s 
Installing collected packages: PyYAML
Successfully installed PyYAML-5.4.1

YAMLの読み込み

YAMLファイルを読み込むために先に、YAMLファイルを作成しました。

下記がYAMLファイルになります。

settings:
  language: jp

option:
  account:
    max: 100
    min: 50

このYAMLファイルを読み込むコードが下記なります。

import yaml

with open('sample.yaml', 'r') as f:
    data = yaml.load(f)
    print(data)

ドキュメント見ながらやったのですが、ワーニングでました(笑)

下記がその内容です。

YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(f)

とりあえずWarningが出ますが、データはしっかりと返ってきていました。

{'settings': {'language': 'jp'}, 'option': {'account': {'max': 100, 'min': 50}}}

ワーニングを消すには、3つの関数のどれかを使うことで消すことができます。

Load関数

  • safe_load
  • full_load
  • unsafe_load

ロードする関数によって、セキュリティ的に変わってきます。

safe_loadかfull_loadのどちらかが良いでしょう。

YAMLで設定した値を取得

値を取得する方法は、辞書型と同じように取得することができます。

下記がそのコードになります。

import yaml

with open('./sample.yaml', 'r') as f:
    data = yaml.safe_load(f)
    print(data['settings']['language']) # jp

日本語のキーが設定できるか確認してみた

INIファイルでは、日本語で設定したファイルを読み込むことができました。

PythonでConfigParserの使い方
PythonのConfigParserを使ったINIファイルの操作
PythonでINIファイルを操作してみます。 ここでいうINIファイルはWindowsのINIファイルではなく、あくまでの似た構造のINIファイルの操作になります。 PythonでINIファイルを操作するために、ConfigParserを ...

続きを見る

YAMLで日本語設定したファイルは、無事読み込むことができるのか試してみました。

読み込むYAMLファイルは下記になります。

設定:
  言語: 日本語

日本語を取得するコードは下記なります。

import yaml

with open('./jp.yaml', 'r') as f:
    data = yaml.unsafe_load(f)
    print(data['設定']['言語']) # 結果 日本語

問題なく「日本語」を取得することができました。

YAMLの新規書き込み

YAMLの新規書き込みを行ってみます。

新規作成はカンタンで、辞書型のデータを作ってそれを、dump関数を使うだけです。

import yaml

with open('write_sample.yaml', 'w') as f:
    data = {
        'setting': {
            'language': 'jp'
        }
    }

    yaml.dump(data, f)

dumpの第1引数に辞書型のデータを入れて、第2引数にファイルのストリームデータを入れます。

書き込まれたファイルの中身は、下記なります。

setting:
  language: jp

YAMLで読み込んだデータに追記して書き込む

YAMLファイルを読み込んで、データを追記して書き込みます。

新規書き込みのセクションで作成したYAMLファイルを利用して、追記処理をしてみます。

import yaml

with open('./write_sample.yaml', 'r+') as f:
    data = yaml.safe_load(f)
    data['setting']['list'] = [1, 2, 3]
    f.seek(0)
    yaml.dump(data, f)

他のサイトとかみると、open関数2回も呼び出すのはダサイと思っていろいろ試しました。

テキストのファイルでもできたので、YAMLでもできるだろってことで上記のコードになりました。

f.seekを使うことで、書き込む位置を先頭に持っていくことで、全体の上書きをしています。

結果は、下記になります。

setting:
  language: jp
  list:
  - 1
  - 2
  - 3

まとめ

PythonでYAMLファイルを操作してみました。

階層構造にできる分、INIファイルよりは扱いやすいと個人的に思います。

階層構造にする必要がなければINIファイルで十分ですが、階層構造が必要だとYAMLやJSONファイルで扱った方が良いです。

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

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

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

続きを見る

Udemyへ

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

-Python
-,