PythonでYAMLをファイルへ読み書きする

このチュートリアルでは、Python 3 で YAML ライブラリを使用する方法について学びます。YAMLはYet Another Markup Languageの略です。

近年では、設定ファイルのデータをシリアライズして保存する用途で非常に人気があります。YAML は本質的にデータフォーマットなので、YAML ライブラリに必要な機能は YAML フォーマットのファイルをパースする能力だけなので、とても簡潔です。

この記事では、データが YAML ファイルにどのように格納されるかを見ることから始めて、次にそのデータを Python オブジェクトにロードします。最後に、Python オブジェクトを YAML ファイルに格納する方法を学びます。では、始めましょう。

先に進む前に、このチュートリアルにはいくつかの前提条件があります。Pythonの構文の基本的な理解、および/または、他の言語で少なくとも初心者レベルのプログラミングの経験を持っている必要があります。それ以外は、このチュートリアルはとてもシンプルで初心者にもわかりやすくなっています。

インストール

YAML のインストール方法はとてもシンプルです。2つの方法があります; 最初に簡単なほうから始めましょう。

方法1: Pip を使う

Python で YAML ライブラリをインストールするもっとも簡単な方法は、pip パッケージマネージャを使うことです。pip がシステムにインストールされている場合、以下のコマンドを実行して YAML をダウンロードし、インストールします。

$ pip install pyyaml


方法2:ソース経由

pipがインストールされていない場合、または上記の方法で何らかの問題が発生した場合は、ライブラリのソースページに移動します。リポジトリをzipファイルでダウンロードし、ターミナルまたはコマンドプロンプトを開き、ファイルがダウンロードされたディレクトリに移動します。そこで、以下のコマンドを実行してください。

$ python setup.py install


YAMLコード例

このセクションでは、YAML ファイルの読み方、つまり Python スクリプトに読み込んで必要に応じて使用する方法から、YAML ファイルの扱い方 (操作方法) を学びます。では、始めましょう。

PythonでYAMLファイルを読む

このセクションでは、Python で YAML ファイルを読み込む方法を見ていきます。

まず、2つのYAML形式のファイルを作ってみましょう。

1つ目のファイルの中身は以下の通りです。

# fruits.yaml file


apples: 20
mangoes: 2
bananas: 3
grapes: 100
pineapples: 1


2つ目のファイルの内容は以下の通りです。

# categories.yaml file


sports:


- soccer
  - football
  - basketball
  - cricket
  - hockey
  - table tennis


countries:


- Pakistan
  - USA
  - India
  - China
  - Germany
  - France
  - Spain


fruits.yamlcategories.yaml` は異なるタイプのデータを含んでいることがわかります。前者は果物という1つの実体に関する情報のみを含み、後者はスポーツや国に関する情報を含んでいます。

それでは、作成した2つのファイルからPythonスクリプトを使ってデータを読み込んでみましょう。YAMLファイルを読み込むには、yamlモジュールの load() メソッドを使用します。次のスクリプトを見てください。

# process_yaml.py file


import yaml


with open(r'E:dataruits.yaml') as file:
    # The FullLoader parameter handles the conversion from YAML
    # scalar values to Python the dictionary format
    fruits_list = yaml.load(file, Loader=yaml.FullLoader)


print(fruits_list)


出力してみましょう。

{ 'apples': 20, 'mangoes': 2, 'bananas': 3, 'grapes': 100, 'pineapples': 1 }


上のスクリプトでは Loader パラメータの値として yaml.FullLoader を指定していますが、これは完全な YAML 言語をロードするため、任意のコードの実行を回避することができます。load関数を使用して、Loaderパラメータの値としてyaml.FullLoaderを渡す代わりに、次の例で説明するように、full_load()` 関数を使用することもできます。

それでは、Python スクリプトを使って、2つ目の YAML ファイルを同じように読み込んでみましょう。

# read_categories.py file


import yaml


with open(r'E:datacategories.yaml') as file:
    documents = yaml.full_load(file)


for item, doc in documents.items():
        print(item, ":", doc)


categories.yaml` ファイルには2つのドキュメントがあるので、両方を読み込むためにループを実行しました。

出力は以下の通りです。

sports : ['soccer', 'football', 'basketball', 'cricket', 'hockey', 'table tennis']
countries : ['Pakistan', 'USA', 'India', 'China', 'Germany', 'France', 'Spain']


最後の2つの例からわかるように、ライブラリは YAML フォーマットのデータを Python の辞書とリストに変換することを自動的に処理します。

PythonでYAMLファイルを書く

YAML ファイルを Python 辞書に変換する方法を学んだので、今度は逆に Python 辞書をシリアライズして YAML フォーマットのファイルに格納する方法を試してみましょう。この目的のために、前回のプログラムの出力として得たのと同じ辞書を使いましょう。

import yaml


dict_file = [{'sports' : ['soccer', 'football', 'basketball', 'cricket', 'hockey', 'table tennis']},
{'countries' : ['Pakistan', 'USA', 'India', 'China', 'Germany', 'France', 'Spain']}]


with open(r'E:datastore_file.yaml', 'w') as file:
    documents = yaml.dump(dict_file, file)


dump()` メソッドは Python 辞書を第一引数として、File オブジェクトを第二引数として受け取ります。

上記のコードが実行されると、カレントワーキングディレクトリに store_file.yaml という名前のファイルが作成されます。

# store_file.yaml file contents:


- sports:


- soccer
  - football
  - basketball
  - cricket
  - hockey
  - table tennis
- countries:


- Pakistan
  - USA
  - India
  - China
  - Germany
  - France
  - Spain


YAML ライブラリが提供する dump() メソッドのもうひとつの便利な機能は、 sort_keys パラメーターです。このパラメータが何をするものなのか、最初のファイルである fruits.yaml に適用してみましょう。

import yaml


with open(r'E:dataruits.yaml') as file:
    doc = yaml.load(file, Loader=yaml.FullLoader)


sort_file = yaml.dump(doc, sort_keys=True)
    print(sort_file)


出力します。

apples: 20
bananas: 3
grapes: 100
mangoes: 2
pineapples: 1


出力では、果物がアルファベット順にソートされているのがわかると思います。

結論

この短いチュートリアルでは、Python の YAML ライブラリ (pyyaml) をインストールして、YAML フォーマットのファイルを操作する方法を学びました。YAML ファイルの内容を辞書として Python プログラムにロードすることと、Python 辞書を YAML ファイルにシリアライズしてキーを格納することを学びました。このライブラリは非常に短く、基本的な機能のみを提供しています。

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