PythonのPyYAMLを使ってYAMLデータを扱う方法

プログラミング

YAMLは設定ファイルや外部のAPIや他システムと連携する際のデータフォーマットとしてよく用いられるフォーマットです。

プログラム内では受け取ったYAMLデータをシステム内に取り込んだり、ファイルなどへ出力したりするなどのYAMLデータの操作を行います。

本記事では、PythonのPyYAMLを使ってYAMLデータを扱う方法についてまとめます。

記載しているプログラムは、Python3.6.8を使って動作確認をしています。

PythonのPyYAMLを使ってYAMLデータを扱う方法

PythonのPyYAMLを使ってYAMLデータを扱う方法として、以下の内容を解説します。

  • YAMLを扱うライブラリ
  • YAMLファイルの読み込み
  • YAMLデータの参照
  • YAMLデータの追加
  • YAMLデータの削除
  • 文字列からYAMLデータへの変換
  • YAMLデータから文字列への変換

YAMLを扱うライブラリ

PythonでYAMLを扱うには、標準機能としては提供されていないため、外部のライブラリを使用する必要があります。
以下の2つが有名なライブラリです。

  • PyYAML
    • YAML操作で最もよく使われるライブラリです。
    • YAMLデータのファイルを読み書きするなどの基本的な操作を提供しています。
  • ruamel.yaml
    • 上記のPyYAMLの改良版として開発されたライブラリです。
    • YAML中のコメントを保持することやYAMLのキーの順序を保持する点などが改良されています。

本記事では、最もよく使われるPyYAMLを使った操作について解説します。

PyYAMLを使用するには、以下のようにダウンロードしてインストールを行います。

pip install pyyaml

プログラムでimportします。

import yaml

YAMLファイルの読み込み

本記事では、以下のYAMLデータを扱います。
様々な形式のデータが含まれているテスト用のデータです。

string: 文字列
int: 2020
bool: true
null: null
array:
- index: 1
  name: JavaScript
- index: 2
  name: Python
object:
  index: 3
  name: Java

上記の内容を data.yaml というファイルで保存し、プログラムから読み込みます。

ファイルからYAMLデータを読み込むには、safe_loadを使います。

with open("./data.yaml") as file:
    yamldata = yaml.safe_load(file)
print(yamldata) # -> {'string': '文字列', 'int': 2020,・・・}

読み込んだ結果は、objectは辞書(dict)、配列はリストとして変換されます。

また、以前はloadを使っていましたが、インターネット上などにある信頼できないYAMLファイルを読み込んだ際に、Pythonの関数を呼び出され、意図しない操作が行われてしまうとの状況から、そうした操作の出来ない安全なsafe_loadを使うことが推奨されています。(loadを使うと警告が出ます)

YAMLデータの参照

読み込んだYAMLファイルは通常の辞書やリストの扱いと同じになります。
文字列や整数の参照は、直接キー名を参照することで値を参照することができます。

print(yamldata['string']) # -> 文字列
print(yamldata['int']) # -> 2020
print(yamldata['bool']) # -> True
print(yamldata[None]) # -> None

配列の参照は、キー名にインデックスを指定します。

print(yamldata['array'][0]['index']) # -> 1
print(yamldata['array'][0]['name']) # -> JavaScript
print(yamldata['array'][1]['index']) # -> 2
print(yamldata['array'][1]['name']) # -> Python

配列なので、ループによる参照も可能です。

for item in yamldata['array']:
    print(item['index']) # -> 1 -> 2
    print(item['name']) # -> JavaScript -> Python

オブジェクトの参照は、ネストするオブジェクトのキー名を指定します。

print(yamldata['object']['index']) # -> 3
print(yamldata['object']['name']) # -> Java

YAMLデータの追加

YAMLデータとして、文字列や整数値の追加するには、直接キーと値を指定します。

yamldata['string2'] = "文字列2"
yamldata['int2'] = 2021
yamldata['bool2'] = False
yamldata['null2'] = None

配列に追加するには、appendを使って追加するYAMLデータを指定します。

yamldata['array'].append({'index': 4, 'name': 'Ruby'})

オブジェクトを追加するには、オブジェクトをネストさせてキーと値を指定します。

yamldata['object']['object2'] = {'index': 5, 'name': 'Go'}

上記で追加したYAMLデータ全体を表示させると以下のようになります。

string: 文字列
int: 2020
bool: true
null: null
array:
- index: 1
  name: JavaScript
- index: 2
  name: Python
- index: 4
  name: Ruby
object:
  index: 3
  name: Java
  object2:
    index: 5
    name: Go
string2: 文字列2
int2: 2021
bool2: false
null2: null

YAMLデータの削除

YAMLデータからデータを削除するには、del を使います。

del yamldata['string2']
del yamldata['int2']
del yamldata['bool2']
del yamldata['null2']
del yamldata['array'][2]
del yamldata['object']['object2']

上記で削除した結果のYAMLデータ全体を表示させると以下のようになります。
(追加した分が削除されて、元の状態に戻っています)

string: 文字列
int: 2020
bool: true
null: null
array:
- index: 1
  name: JavaScript
- index: 2
  name: Python
object:
  index: 3
  name: Java

文字列からYAMLデータへの変換

文字列からYAMLデータへ変換するには、ファイルの読み込みと同様にsafe_loadに文字列を指定します。

s = '''
text: テキスト
num: 1
'''
y = yaml.safe_load(s)
print(y) # -> {'text': 'テキスト', 'num': 1}

YAMLデータから文字列への変換

YAMLデータから文字列へ変換するには、dumpを使います。

str = yaml.dump(y, allow_unicode=True)
print(str)

上記のプログラムの結果は、以下のように改行を含み、整形されて出力されます。
また、日本語をそのまま出力するには、allow_unicodeにTrueを指定します。(デフォルトFalse)

num: 1
text: テキスト

改行せずにそのまま出力するには、default_flow_styleにTrueを指定します。

str = yaml.dump(y, allow_unicode=True, default_flow_style=True)
print(str) # -> {num: 1, text: テキスト}

まとめ

PythonのYAML操作についてまとめると、以下のようになります。

  • PythonでYAMLデータを扱うには、外部ライブラリが必要でPyYAMLがよく使われる。
  • YAMLデータをファイルから読み込むと、辞書とリストに変換される。
  • YAMLデータを出力する際には、様々なオプションによって整形することができる。

YAMLデータを扱う際には、簡単に扱えるPyYAMLを使ってみてはいかがでしょうか。

 

今回は、PythonのPyYAMLを使ってYAMLデータを扱う方法を解説しました。

以上、参考になれば幸いです。

コメント

タイトルとURLをコピーしました