読み込み中...

PythonとYAMLを組み合わせてマスターする7つのステップ

PythonとYAMLを使用したプログラミングチュートリアルの画像 Python
この記事は約14分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミングにおいて、設定ファイルやデータの格納に使われるYAMLは、その人間にやさしい構文と、言語間での互換性から多くのプログラマーに愛されています。

特にPythonと組み合わせた利用が注目されています。

しかし、初めてこの組み合わせに触れる方にとっては、どのように始めればいいのか迷うかもしれません。

そこで今回は、PythonでYAMLファイルを読み込むための7つのステップを徹底的に解説します。

●PythonとYAMLの基本

○Pythonとは?

Pythonは、シンプルで読みやすい構文が特徴のプログラミング言語です。

初心者にも親しみやすく、高度な計算機能からウェブ開発、データ分析まで、幅広い分野で活用されています。

○YAMLとは?

YAML(ヤムル)とは、”YAML Ain’t Markup Language”の略で、データ記述言語の1つです。

JSONやXMLのように、データ構造を視覚的に理解しやすい形で表現することができます。

その上、人間が読み書きしやすい構文が特徴で、設定ファイルやデータの保存など、多岐にわたって活用されています。

●PythonでYAMLを読み込むための環境準備

○Pythonのインストール方法

Pythonのインストールは公式ウェブサイトからダウンロードするのが一般的です。

ダウンロードした後、インストーラーに従ってPythonをインストールします。

○YAMLパーサライブラリPyYAMLのインストール方法

PythonでYAMLを扱うためには、YAMLパーサライブラリが必要となります。

その中でも、PyYAMLは非常に人気のあるライブラリです。

PyYAMLのインストールは、Pythonのパッケージ管理ツールであるpipを用いて、次のコマンドを実行することで簡単に行うことができます。

pip install PyYAML

このコードは、pipコマンドを使ってPyYAMLをインストールするコマンドを紹介しています。

この例では、ターミナルまたはコマンドプロンプトを開き、上記のコマンドを実行してPyYAMLをインストールしています。

●PythonでYAMLファイルを読み込む方法:基本ステップ

○サンプルコード1:基本的なYAMLファイルの読み込み

PythonでYAMLファイルを読み込む最も基本的なコードは次のようになります。

import yaml

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

print(data)

このコードでは、PyYAMLを使って基本的なYAMLファイルを読み込む方法を紹介しています。

この例では、まずyamlモジュールをインポートし、次にopen関数を使って’YAML’ファイルを読み込みモードで開いています。

その後、yamlのsafe_load関数を使用して、YAMLファイルをPythonのデータ構造に変換し、その結果をprint関数を使って出力しています。

これを実行すると、YAMLファイルの内容がPythonのデータ構造として表示されます。

このようにPythonでYAMLファイルを読み込むことで、その内容をプログラム内で自由に操作できるようになります。

○サンプルコード2:ネストしたYAMLファイルの読み込み

PythonとYAMLを組み合わせて使う際のもう一つの重要なポイントは、ネスト(入れ子になったデータ構造)を含むYAMLファイルの取り扱いです。

ここでは、PythonでネストしたYAMLデータをどのように読み込むかを示すサンプルコードをご紹介します。

次のようなYAMLファイル(sample.yaml)を想定します。

staff:
  - name: Taro Yamada
    age: 25
    skills:
      - Python
      - YAML
  - name: Hanako Tanaka
    age: 28
    skills:
      - Java
      - Git

このYAMLファイルでは、複数のスタッフの情報(名前、年齢、スキル)をネストの形で管理しています。

下記のPythonコードは、このYAMLファイルを読み込み、各スタッフの情報を辞書として出力します。

import yaml

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

for staff in data['staff']:
    print(staff)

このコードでは、まずyaml.safe_load()関数を使ってYAMLファイルを読み込みます。

そして、得られたデータ(リスト内の辞書)をforループを使って一つずつ出力します。

これを実行すると、次のような結果が得られます。

{'name': 'Taro Yamada', 'age': 25, 'skills': ['Python', 'YAML']}
{'name': 'Hanako Tanaka', 'age': 28, 'skills': ['Java', 'Git']}

このように、Pythonを使えば、ネストしたYAMLデータも簡単に読み込むことができます。

○サンプルコード3:YAMLファイルから辞書オブジェクトへの変換

次に、YAMLファイルを読み込んでPythonの辞書オブジェクトに変換する方法を見ていきましょう。

これはYAMLのデータをPythonで扱いやすくするために非常に重要です。

次のようなYAMLファイル(config.yaml)を想定します。

database:
  host: localhost
  port: 3306
  user: root
  password: secret

このYAMLファイルはデータベースの設定情報を保存しています。

下記のPythonコードは、このYAMLファイルを読み込み、その内容を辞書オブジェクトとして出力します。

import yaml

with open('config.yaml', 'r') as f:
    config = yaml.safe_load(f)

print(config)

このコードでは、yaml.safe_load()関数を用いてYAMLファイルを読み込み、Pythonの辞書に変換しています。

最後にprint()関数を用いてその内容を出力します。

このコードを実行すると、次のような結果が得られます。

{'database': {'host': 'localhost', 'port': 3306, 'user': 'root', 'password': 'secret'}}

このように、Pythonを使ってYAMLファイルを辞書に変換することで、その後のデータの利用が容易になります。

●PythonでYAMLファイルを読み込む方法:応用ステップ

今まで学んだ基本的なステップを経て、より深みのあるPythonとYAMLの使い方へと進みます。

応用ステップとして、複数のデータオブジェクトへの変換と、読み込みエラーのハンドリングについて見ていきましょう。

○サンプルコード4:YAMLファイルから複数のデータオブジェクトへの変換

このコードでは、YAMLファイルから複数のデータオブジェクトをPythonで読み込む方法を示しています。

YAMLはその構造上、複数のドキュメントを1つのファイルに格納することが可能です。

ここでは、その機能を利用して複数のデータオブジェクトを読み込む例を紹介します。

import yaml

with open('multiple_documents.yaml', 'r') as file:
    documents = yaml.load_all(file, Loader=yaml.FullLoader)

    for doc in documents:
        print(doc)

この例では、まずPyYAMLのload_all関数を使って、YAMLファイルから複数のドキュメントを読み込んでいます。

その後、各ドキュメントを順に出力しています。

このコードを実行すると、YAMLファイル内のすべてのドキュメントが順に出力されます。

それぞれのドキュメントはPythonの辞書として読み込まれ、その内容が表示されます。

○サンプルコード5:YAMLファイルの読み込みエラーのハンドリング

このコードでは、PythonでYAMLファイルを読み込む際に起きうるエラーの取り扱い方を示しています。

ファイルの読み込みやデータの解析中にエラーが発生することはよくあります。

そこで、Pythonの例外処理機構を利用して、これらのエラーを適切にハンドリングする方法を学びましょう。

import yaml

try:
    with open('invalid.yaml', 'r') as file:
        data = yaml.load(file, Loader=yaml.FullLoader)
except FileNotFoundError:
    print('YAMLファイルが見つかりません。')
except yaml.YAMLError as e:
    print('YAMLファイルの解析中にエラーが発生しました。')
    print(e)

この例では、まずtryブロック内でYAMLファイルの読み込みを試みています。

ここで2種類のエラー、FileNotFoundErrorYAMLErrorが発生する可能性があります。

ファイルが存在しない場合、FileNotFoundErrorが発生します。

また、YAMLファイルが無効な形式である場合、YAMLErrorが発生します。

それぞれのエラーが発生した場合、対応するexceptブロックが実行され、エラーメッセージが表示されます。

これにより、エラーの発生原因を特定しやすくなります。

このコードを実行すると、指定したYAMLファイルが存在しない場合や、YAMLファイルの形式が無効な場合にエラーメッセージが表示されます。

このように、エラーを適切にハンドリングすることで、コードのロバスト性を高めることができます。

●PythonとYAMLの組み合わせ:実践的な使い方

PythonとYAMLの組み合わせは、実務で頻繁に使用される方法です。

設定ファイルの作成やデータの永続化など、さまざまなタスクに利用されます。

次に、その具体的な使用例を見てみましょう。

○サンプルコード6:設定ファイルとしてのYAMLの利用

YAMLファイルは設定ファイルとして利用されることが多いです。

様々な設定値を一元管理することで、ソースコード中から設定値を排除し、プログラムの柔軟性を高めることができます。

ここでは、簡単な設定ファイルの読み込みを行うPythonコードを紹介します。

import yaml

# YAMLファイルを読み込み、辞書型として格納
with open('config.yaml', 'r') as f:
    config = yaml.safe_load(f)

# 設定値を利用
host = config['database']['host']
port = config['database']['port']

このコードでは、’config.yaml’という名前のYAMLファイルを読み込み、その内容を辞書型として格納しています。

次に、その辞書からデータベースのホスト名とポート番号を取得しています。

この例では、YAMLファイルにデータベースの設定値が保存されていると仮定しています。

○サンプルコード7:YAMLファイルを使ったデータの永続化

YAMLファイルは、データの永続化にも使われます。

プログラムの実行結果を保存したり、プログラム間でデータをやりとりする際に使用することがあります。

ここでは、Pythonのリストと辞書をYAMLファイルに書き出す例を紹介します。

import yaml

# 書き出すデータ
data = {
    'fruits': ['apple', 'banana', 'cherry'],
    'vegetables': ['carrot', 'lettuce', 'onion']
}

# データをYAML形式でファイルに書き出す
with open('data.yaml', 'w') as f:
    yaml.safe_dump(data, f)

このコードでは、fruitsとvegetablesの2つのキーを持つ辞書を作成し、それぞれにリストのデータを格納しています。

そして、この辞書をYAML形式でファイルに書き出しています。

この結果、’data.yaml’という名前のYAMLファイルが生成され、その中にPythonのデータが保存されます。

次に、YAML形式のデータをPythonで読み込む方法を紹介します。

import yaml

# YAMLファイルからデータを読み込む
with open('data.yaml', 'r') as f:
    data = yaml.safe_load(f)

# データを表示
print(data['fruits'])  # ['apple', 'banana', 'cherry']
print(data['vegetables'])  # ['carrot', 'lettuce', 'onion']

このコードでは、先ほど作成したYAMLファイルを読み込み、その内容をPythonの辞書として取り出しています。

その後、読み込んだデータを表示しています。

これにより、YAMLファイルからPythonのデータ構造を復元することができます。

●注意点と対処法

YAMLを取り扱う際には、次の三つのポイントを頭に入れておきましょう。

○YAMLファイルのインデントについて

YAMLの文法は、インデント(字下げ)を使ってデータの階層構造を表現します。

しかし、インデントの深さや種類(タブとスペース)が一貫していないとエラーが発生します。

下記のサンプルコードは、タブとスペースが混在しているYAMLファイルを読み込む際にエラーが発生することを表しています。

import yaml
try:
    with open('invalid.yaml', 'r') as f:
        data = yaml.safe_load(f)
except yaml.YAMLError as e:
    print(f"エラー発生: {e}")

“invalid.yaml”という名前のYAMLファイルが、タブとスペースが混在していると仮定します。

エラーが発生した場合、そのエラーメッセージを表示します。

このコードを実行すると、次のようなエラーメッセージが出力されます。

エラー発生: while scanning for the next token found character '\\t' that cannot start any token

インデントには常にスペースを使用し、タブは使用しないようにしましょう。

また、エディタの設定で自動的にタブをスペースに変換するようにすると良いでしょう。

○大量のデータを扱う際のパフォーマンスについて

YAMLファイルに大量のデータが格納されている場合、ファイル全体をメモリに読み込むと、システムのパフォーマンスに影響を及ぼす可能性があります。

そのような場合は、データを逐次的に処理する「ストリーミング」方式を採用すると良いでしょう。

PyYAMLライブラリでは、このストリーミング方式をサポートしています。

import yaml

with open('large_data.yaml', 'r') as f:
    for data in yaml.safe_load_all(f):
        # dataを処理するコード

このコードでは、”large_data.yaml”という大量のデータを含むYAMLファイルを開いています。

そして、yaml.safe_load_all関数を使用して、YAMLドキュメントを順番に読み込み、それぞれのデータを処理します。

○セキュリティ上の考慮点

PythonでYAMLを扱う際は、特にセキュリティ面での注意が必要です。

なぜなら、YAMLファイルには任意のPythonオブジェクトをシリアライズ(文字列化)できるからです。

この特性が悪用されると、不正なコードが実行される恐れがあります。

そのため、信頼できないソースからのYAMLファイルを読み込む際は、yaml.safe_load関数を使用しましょう。

この関数は、Pythonの組み込み型のみをデシリアライズ(オブジェクト化)します。

yaml.load関数を使うと、任意のPythonオブジェクトをデシリアライズするため、潜在的なセキュリティリスクがあります。

import yaml

with open('trusted_source.yaml', 'r') as f:
    data = yaml.safe_load(f)
    # dataを処理するコード

このコードでは、”trusted_source.yaml”という信頼できるソースからのYAMLファイルを安全に読み込んでいます。

まとめ

以上がPythonでYAMLを扱う際の基本と応用のステップ、そして注意点になります。

これらの知識を手に入れることで、PythonとYAMLの組み合わせによるデータ処理がよりスムーズになることでしょう。

PythonとYAMLを組み合わせてデータを取り扱うことは、設定ファイルの管理、データの永続化、そして大量のデータの取り扱いなど、多岐にわたる場面で有用です。

是非とも、この記事で学んだ知識を活用して、PythonとYAMLの組み合わせをマスターしてください。