コンテンツにスキップ

pyyamlを使ったデータの読み込みと保存方法を簡単に解説

[

YAML: Pythonにおける欠けているバッテリー

Pythonは、プログラミング言語に期待されるほとんどの機能が含まれているため、「バッテリー付属」としてよく宣伝されています。これは、標準ライブラリと外部モジュールが広範なプログラミングのニーズをカバーしているため、ほぼ正しいと言えます。ただし、明らかな共通点があるにもかかわらず、Pythonには一般的に設定やシリアライズに使用されるYAMLデータ形式への組み込みサポートが欠けています。

このチュートリアルでは、利用可能なサードパーティライブラリであるPyYAMLを中心に、PythonでYAMLを扱う方法を学びます。YAMLについて新しく学ぶか、長い間使用していなかった場合は、トピックに詳しく踏み込む前にクイッククラッシュコースを受講する機会があります。

このチュートリアルでは、次のことを学ぶことができます:

  • PythonでYAMLドキュメントを読み込み書き込む
  • Pythonの組み込みデータ型とカスタムデータ型をYAMLにシリアライズする
  • 信頼できないソースからのYAMLドキュメントを安全に読み込む
  • YAMLドキュメントを低レベルでパースする方法についての制御を取る

後で、YAMLの高度な、潜在的に危険な機能とそれから自身を保護する方法について学びます。YAMLを低レベルでパースするために、シンタックスハイライトツールとHTMLのインタラクティブプレビューを作成します。最後に、カスタムのYAMLタグを活用してデータ形式の構文を拡張します。

このチュートリアルを最大限に活用するためには、Pythonでのオブジェクト指向プログラミングに精通しており、クラスを作成する方法を知っている必要があります。準備ができたら、以下のリンクをクリックして、このチュートリアルでコーディングする例のソースコードを入手できます。

YAMLのクラッシュコース

このセクションでは、YAMLの基本的な事実について学びます。使用方法、構文、および一部のユニークで強力な機能について説明します。すでにYAMLを使用している場合は、PythonでYAMLを使用する方法をカバーする次のセクションから読み進めることができます。

歴史的な背景

YAMLは、camel と韻を踏む単語で、再帰的な頭字語です。

XMLとJSONとの比較

YAMLは、より人間に読み書きしやすい形式でテキストデータを表現するためのデータフォーマットです。XMLとJSONに比べて、より簡潔で直感的な構文を持っています。

YAMLの実用的な使い道

YAMLの主な利点は、設定ファイルやデータのシリアライズに使用することです。YAMLは、データをヒューマンリーダブルな形式で保存し、他のプログラミング言語やプラットフォームで解析するための標準形式として広く使用されています。

YAMLの構文

YAMLの基本的な構文は、インデントを使用して階層構造を表します。この階層構造により、データの関係を視覚的に表現することができます。

ユニークな特徴

YAMLには、他のデータ形式には見られないユニークな特徴がいくつかあります。たとえば、データの参照やアンカー、エイリアスなど、データを効果的に再利用するための機能です。

PythonでYAMLを使ってはじめる

このセクションでは、PythonでYAMLを使用する方法について学びます。具体的には、YAMLドキュメントをシリアライズし、デシリアライズする方法について説明します。

JSONとしてYAMLドキュメントをシリアライズする

まず、PythonでYAMLドキュメントをシリアライズする方法を学びます。Pythonには、YAML形式のドキュメントをシリアライズするための組み込みのサポートはありませんが、JSON形式としてシリアライズすることができます。これにより、PyYAMLライブラリを使用せずにJSONとしてYAMLドキュメントを処理することができます。

import yaml
data = {
'name': 'John Doe',
'age': 30,
'city': 'New York'
}
serialized_data = yaml.dump(data, default_flow_style=False)
print(serialized_data)

上記の例では、Pythonの辞書オブジェクトを作成し、yaml.dump()関数を使用してYAMLドキュメントとしてシリアライズしています。default_flow_style=Falseを指定して、出力をブロックスタイルに設定しています。

PyYAMLライブラリのインストール

PyYAMLライブラリを使用するには、まずライブラリをインストールする必要があります。以下のコマンドを使用して、PyYAMLをインストールします。

ターミナルウィンドウ
pip install pyyaml

これで、PyYAMLライブラリがインストールされました。

最初のYAMLドキュメントの読み書き

次に、Pythonで最初のYAMLドキュメントを読み書きする方法について見ていきます。PyYAMLライブラリを使用して、YAMLドキュメントを読み込んだり書き込んだりする方法を示します。

import yaml
# YAMLドキュメントの読み込み
with open('data.yaml') as file:
data = yaml.safe_load(file)
# YAMLドキュメントの書き込み
with open('output.yaml', 'w') as file:
yaml.dump(data, file)

上記のコードでは、yaml.safe_load()関数を使用してYAMLドキュメントを読み込み、yaml.dump()関数を使用してYAMLドキュメントを書き込んでいます。ファイルを読み書きする場合は、open()関数を使用してファイルをオープンし、ファイルオブジェクトを作成します。

このようにして、PythonでYAMLドキュメントを読み書きすることができます。

PythonでYAMLドキュメントを読み込む

PythonでYAMLドキュメントを読み込む方法について学びます。YAMLドキュメントをPythonオブジェクトに変換するには、通常はPyYAMLライブラリを使用します。

ローダークラスの選択

PyYAMLでは、異なる方法でYAMLドキュメントを読み込むために複数のローダークラスを提供しています。適切なローダークラスを選択することで、異なる形式のYAMLドキュメントを適切に読み込むことができます。

import yaml
# 直接読み込み
data1 = yaml.safe_load('name: John Doe\nage: 30')
# ファイルから読み込み
with open('data.yaml') as file:
data2 = yaml.safe_load(file)

上記のコードでは、yaml.safe_load()関数を使用してYAMLドキュメントを読み込んでいます。直接YAMLドキュメントを指定する場合は、文字列として渡すことができます。ファイルから読み込む場合は、open()関数を使用してファイルをオープンし、ファイルオブジェクトを指定します。

ローダーの機能の比較

PyYAMLの異なるローダークラスには、読み込むYAMLドキュメントの機能に異なる影響を与える機能があります。

import yaml
# タグを解決しないローダー
loader1 = yaml.loader.Loader
# タグを解決するローダー
loader2 = yaml.loader.SafeLoader
# カスタム機能を提供する特殊なローダー
loader3 = yaml.loader.FullLoader

上記のコードでは、yaml.loader.Loaderyaml.loader.SafeLoaderyaml.loader.FullLoaderの3つの異なるローダークラスを示しています。

セキュリティ上の懸念

YAMLドキュメントを読み込む場合、セキュリティ上の懸念が存在する可能性があります。YAMLには特定の機能があり、これらを悪用されると脆弱性が発生する可能性があります。

import yaml
# 安全な読み込み
data1 = yaml.safe_load('!python/object:__main__.Person')
# 完全な読み込み
data2 = yaml.load('!python/object:__main__.Person', Loader=yaml.SafeLoader)

上記のコードでは、`!python/obje…