【2026年9月最新】PythonのPyYAMLでYAMLを読み書きする方法完全ガイド|yaml.safe_loadを使うべき理由
「PythonでYAMLファイルを読み書きしたい」「PyYAMLのyaml.loadを使ったらエラーが出た」——この記事にたどり着いた方は、設定ファイルの読み込み処理で足止めを食っているのではないでしょうか。
結論から言うと、YAMLファイルを読み込むならyaml.safe_load(file)、書き出すならyaml.dump(data, file, default_flow_style=False)が基本形です。ただし、古い記事や書籍でよく見るyaml.load(file)という書き方は、現在のPyYAMLではエラーになるか、セキュリティ上のリスクを伴います。
この記事では、YAMLの基本記法からPyYAMLでの読み書き、yaml.load/safe_load/FullLoaderの違い、dumpの書式オプションまで、コード例つきで整理します。あわせて、弊社(株式会社GENAI)がClaude Codeを全社で運用している立場から、「設定ファイルのようなコード周辺リスクを、非エンジニアの経営者がどう管理するか」という視点も加えて解説します。
この記事を最後まで読むと、次の6つが明確になります。
01 BASICS YAMLとは何か|基本記法を理解する 非エンジニアにも分かる例え話で理解する
YAMLは、設定ファイルやデータ保存によく使われる、人間にとって読み書きしやすいデータ形式です。GitHub Actions・Docker Compose・Kubernetes・Ansibleなど、多くの開発ツールが設定ファイルの形式としてYAMLを採用しています。
📚 用語解説
YAML:「YAML Ain't Markup Language」の再帰的頭字語。インデント(字下げ)で階層構造を表現するデータ記述形式で、XMLやJSONと同じ「データを構造化して保存する」役割を持ちます。エクセルの表よりも柔軟に、プログラムの設定ファイルとしてよく使われます。
YAMLの基本的な記法は、以下のようにキーと値を:(コロン)で区切り、インデントで階層を表現します。
# コメントは # から始まる
name: 山田太郎
age: 30
department: 営業部
skills:
- Excel
- プレゼンテーション
- 英会話
address:
prefecture: 東京都
city: 渋谷区
リスト(配列)は行頭に- (ハイフン+半角スペース)を付けて表現し、入れ子の構造はPythonと同じようにインデントの深さで表します。この「見た目のまま構造が伝わる」読みやすさが、YAMLが設定ファイルとして広く使われている理由です。
📚 用語解説
インデント (indent):行頭に空白を入れて字下げすること。YAMLではこのインデントの深さが「どの項目の中に含まれるデータか」を表す、構文上重要な意味を持ちます。タブ文字は使えず、半角スペースのみが許可されている点に注意が必要です。
key: valueは辞書、- 要素はリスト、とセットで覚えておくと読み書きがスムーズになります。1-1. 複数行の文字列を書く記法
YAMLでは、複数行にわたる長い文字列を扱うための専用記法も用意されています。
| 記法 | 意味 | 改行の扱い |
|---|---|---|
|(リテラルスタイル) | 改行をそのまま保持する | 書いた通りの改行が反映される |
>(フォールドスタイル) | 改行をスペースに変換して1行に畳み込む | 段落として1つの文にまとまる |
description_literal: |
1行目です。
2行目です。
description_folded: >
1行目です。
2行目ですが、
1行にまとめられます。
1-2. アンカーとエイリアスで重複を避ける
YAMLにはアンカー(&名前)とエイリアス(*名前)という、同じ内容を使い回すための仕組みもあります。設定ファイルの中で同じ値を何度も書きたい場合に便利です。
default_settings: &defaults
timeout: 30
retry: 3
service_a:
<<: *defaults
port: 8080
service_b:
<<: *defaults
port: 8081
&defaultsでアンカーを定義し、*defaultsでその内容を参照します。<<: *defaultsという書き方は「マージキー」と呼ばれ、参照先の内容を現在のマッピングに展開(合成)する働きをします。同じ設定を複数箇所にコピペする必要がなくなり、修正漏れのリスクも減らせます。
📚 用語解説
アンカー・エイリアス:YAML内で同じデータを再利用するための仕組み。&名前で定義(アンカー)し、*名前で参照(エイリアス)します。同じ設定値を何度も書く手間と、修正漏れのリスクを同時に減らせます。
02 INSTALL & BASICS PyYAMLのインストールと基本の読み書き まずは環境構築から、最小のコード例まで
PyYAMLは、pipコマンドでインストールできます。パッケージ名はpyyamlですが、インポート時のモジュール名はyamlである点に注意してください。
pip install pyyaml
📚 用語解説
PyYAML:PythonでYAML形式のデータを読み書きするための標準的なサードパーティライブラリ。インポート名はyaml。Python公式の標準ライブラリには含まれていないため、事前にpipでのインストールが必要です。
2-1. YAMLファイルを読み込む
以下はconfig.yamlというファイルを読み込み、辞書型のデータとして扱う最小コードです。
import yaml
with open('config.yaml', encoding='utf-8') as f:
data = yaml.safe_load(f)
print(data['name'])
print(data['skills'])
yaml.safe_load()は、YAMLファイルの内容をPythonの辞書型・リスト型・文字列・数値などの基本的な型に変換して返します。with open(...)でファイルを開き、そのファイルオブジェクトを渡すのが基本パターンです。
2-2. YAMLファイルへ書き込む
逆にPythonの辞書型データをYAML形式でファイルに書き出す場合は、yaml.dump()を使います。
import yaml
data = {
'name': '山田太郎',
'age': 30,
'skills': ['Excel', 'プレゼンテーション', '英会話'],
}
with open('output.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data, f, allow_unicode=True, default_flow_style=False)
デフォルト設定のままだと、日本語などの非ASCII文字が\uXXXX形式のエスケープシーケンスで出力され、人間には読みにくいファイルになります。日本語を含むデータを書き出す場合は、allow_unicode=Trueを必ず指定してください。
読み込みから書き込みまでの一連の流れを図解すると、以下のようになります。
config.yaml
を用意
辞書型データに
変換
値の読み取り・
更新
YAML形式で
再度書き出し
2-3. 複数のYAMLドキュメントを1ファイルで扱う
YAMLでは、---(ハイフン3つ)を区切りとして、1つのファイルに複数のドキュメントを並べて書くことができます。Kubernetesのマニフェストファイルなどで、この書き方がよく使われます。
# doc1.yaml
name: サーバーA
port: 8080
---
name: サーバーB
port: 8081
複数ドキュメントを読み込む場合は、yaml.safe_load()ではなくyaml.safe_load_all()を使います。戻り値はジェネレータになるため、for文などで1つずつ取り出します。
import yaml
with open('doc1.yaml', encoding='utf-8') as f:
for doc in yaml.safe_load_all(f):
print(doc['name'], doc['port'])
yaml.safe_load()は単一ドキュメント用、yaml.safe_load_all()は複数ドキュメント用です。単一ドキュメントのファイルに対して誤って_all系を使うと、ジェネレータが1件だけ返る形になり、扱い方を間違えるとハマりやすいので注意してください。
2-4. PyYAML(YAML)とjsonモジュール(JSON)の使い分け
Python標準ライブラリのjsonモジュールと役割が似ているため、「どちらを使えばいいのか」と迷う方も多いはずです。用途に応じた使い分けの目安を整理します。
| 観点 | YAML (PyYAML) | JSON (json) |
|---|---|---|
| 可読性 | コメントが書け、人間には読みやすい | コメント不可。機械間のやり取り向き |
| 標準ライブラリ | 含まれない(pip install pyyaml が必要) | Python標準ライブラリに標準搭載 |
| 主な用途 | 人が編集する設定ファイル(CI/CD定義等) | API通信、ログ、プログラム間のデータ交換 |
| 読み込みの安全性 | Loaderの選択によりリスクが変わる | json.load()は標準で安全 |
「人間が読み書きする設定ファイル」ならYAML、「プログラム同士がやり取りするデータ」ならJSON、という使い分けが基本方針になります。なお、JSON標準ライブラリのjson.load()はYAMLのUnsafeLoaderのような任意コード実行のリスクを構造上持たないため、この点でもYAMLより安全に使いやすい設計になっています。
03 LOAD vs SAFE_LOAD yaml.loadとyaml.safe_loadの違い なぜ古い書き方がエラーになるのか、根本から理解する
古い入門記事や書籍では、yaml.load(file)という書き方をよく見かけます。しかし、現在のPyYAML(バージョン5.4以降)でこのコードを実行すると、Loaderを指定していないためエラーになります。
import yaml
with open('config.yaml') as f:
data = yaml.load(f) # TypeError: load() missing 1 required positional argument: 'Loader'
これは仕様変更ではなく、セキュリティ上の理由による意図的な変更です。PyYAML 5.1で「Loaderを明示すべき」という警告が追加され、PyYAML 5.4で完全に必須化されました。
3-1. Loaderの種類と違い
| Loader | 安全性 | できること |
|---|---|---|
| yaml.SafeLoader(yaml.safe_load) | 安全 | Pythonの基本型(辞書・リスト・文字列・数値等)のみ変換 |
| yaml.FullLoader | ほぼ安全 | safe_loadより広い型に対応。ただし一部の複雑な構造は変換不可 |
| yaml.UnsafeLoader / yaml.Loader | 危険 | 任意のPythonオブジェクトを生成可能。信頼できないデータには使用禁止 |
📚 用語解説
Loader(ローダー):YAMLのテキストをPythonのオブジェクトに変換する際の「変換ルールの種類」。どこまで幅広い型への変換を許可するかによって、SafeLoader・FullLoader・UnsafeLoaderなど複数の種類が用意されています。安全性と機能性はトレードオフの関係にあります。
3-2. なぜUnsafeLoaderが危険なのか
YAMLのタグ拡張の仕組みを使って、PyYAMLは!!python/object/apply:...のような「特定のPythonオブジェクトを直接生成する」独自タグを定義しています。UnsafeLoader(旧来のyaml.Loader)を使ってこの形式のYAMLを読み込むと、攻撃者が仕込んだ任意のPythonコードが実行されてしまう可能性があります。
外部からアップロードされたファイル、ユーザー入力、インターネット経由で取得したデータなど、「誰が書いたか分からないYAML」は必ずyaml.safe_load()で読み込んでください。UnsafeLoaderの使用は、自分で完全に内容を管理しているファイルに限定すべきです。
この構造は、Pythonのpickleモジュールが抱える「信頼できないデータを読み込むと任意コード実行につながる」というリスクと本質的に同じです。「便利な機能ほど、悪用時のリスクも大きい」という典型例と言えます。
特別な理由がない限り、YAMLの読み込みは常にyaml.safe_load()を使ってください。日付型やタプルなど一部の複雑な型を扱いたい場合のみyaml.FullLoaderを検討し、UnsafeLoaderは基本的に使わない、という方針が実務上もっともシンプルで安全です。
04 DUMP OPTIONS yaml.dumpの書式オプションを使いこなす ブロックスタイルとフロースタイルの違い
yaml.dump()には、出力形式を制御するオプションがいくつか用意されています。代表的なものを整理します。
| オプション | 意味 | 指定例 |
|---|---|---|
| default_flow_style | ブロックスタイル/フロースタイルの切り替え | False(ブロック)/ True(フロー) |
| allow_unicode | 非ASCII文字(日本語等)をそのまま出力 | True |
| sort_keys | 辞書のキーをアルファベット順に並べ替えるか | False(元の順序を維持) |
| indent | インデント幅(スペース数) | 2 や 4 など |
default_flow_styleをFalseにすると、リストや辞書が改行・インデントで表現される「ブロックスタイル」で出力されます。Trueにすると、JSONに近い「フロースタイル」([a, b, c]のような1行表記)になります。
data = {'skills': ['Excel', 'プレゼンテーション']}
# ブロックスタイル
yaml.dump(data, default_flow_style=False, allow_unicode=True)
# skills:
# - Excel
# - プレゼンテーション
# フロースタイル
yaml.dump(data, default_flow_style=True, allow_unicode=True)
# {skills: [Excel, プレゼンテーション]}
人間が読み書きする設定ファイルとして使うなら、可読性の高いdefault_flow_style=False(ブロックスタイル)を明示的に指定するのが安全です。PyYAMLはバージョンによって省略時の既定の挙動に差があるため、意図した形式で出力したい場合は必ず明示的に指定してください。
また、sort_keys=Falseを指定しないと、辞書のキーが自動的にアルファベット順に並べ替えられる点にも注意が必要です。元のデータの順序を保ったまま出力したい場合は、このオプションも忘れずに指定します。
05 BUSINESS RISK なぜ設定ファイルの読み込み方法が経営リスクなのか 技術的な話を、経営者が判断できる言葉に翻訳する
ここまで解説してきた「安全でないLoaderの使用」は、単なるコーディングスタイルの好みではなく、経営者が向き合うべきリスクでもあります。ここでは非エンジニアの視点で、なぜこれが問題になるのかを整理します。
そのまま流用
yaml.load()を
そのまま使用
設定ファイルを読込
取引先・顧客からの
データも読み込む
紛れ込むと実行
任意コード実行の
リスク
この一連の流れは、「動作確認では何も問題が起きない」からこそ見過ごされやすいという点が厄介です。安全でない書き方でも、悪意あるデータが投入されない限りは普通に動作してしまうため、レビューで指摘されない限り、本番運用まで気づかれないケースが少なくありません。
06 GENAI CASE STUDY Claude Codeでコードのリスクを減らすという選択肢 弊社GENAIの実運用データで見る、設定ファイル周りのリスク管理
弊社(株式会社GENAI)ではClaude Max 20xプラン(月額$200・約30,000円)を契約し、経営・営業・広告・開発・経理・秘書業務まで社内のあらゆる業務でClaude Codeを活用しています。開発領域では、こうしたコードのリスクチェックもその一つです。
Claude Codeは、「このコードに安全でないYAML読み込みがないか確認して」と日本語で頼むだけで、該当箇所を指摘し、safe_loadへの置き換えまで提案してくれます。バージョンアップで非推奨になった書き方の検出のような、地道な確認作業を機械的に任せられる領域です。
| チェック内容 | 人力レビューのみの場合 | Claude Codeを併用する場合 |
|---|---|---|
| 非推奨のyaml.load()の検出 | 該当箇所をコード全体から手動で探す | 該当パターンを機械的に洗い出す |
| safe_loadへの置き換え | 1箇所ずつ手作業で修正 | 修正案を一括で提示・適用 |
| ライブラリのバージョン起因の非互換調査 | 公式ドキュメントを都度確認 | 変更点を要約して提示 |
| レビューにかかる時間 | 担当者の稼働に依存 | 即座に初期チェックが完了 |
弊社の開発領域(WordPress・LP制作・各種スクリプトの書き捨て等)では、外部データを扱うスクリプトを書く際に、こうしたリスクチェックをClaude Codeに任せることで、都度数時間かかっていた確認作業がその場で完結する肌感で削減できています。
📚 用語解説
デシリアライズ攻撃:YAMLやpickleのような「文字列をプログラムのオブジェクトに復元する」処理(デシリアライズ)を悪用し、復元の過程で悪意あるコードを実行させる攻撃手法の総称。YAMLのUnsafeLoaderや、Pythonのpickleモジュールの安易な使用は、いずれもこのリスクに該当します。
本章の削減時間は弊社の肌感ベースの参考値であり、業種・業態・担当者のスキルによって変動します。「完全自動化」ではなく、最終確認は引き続き人の判断が必要です。
6-1. 「コードが読めない経営者」でも判断できる体制づくり
弊社がClaude Codeを導入して感じているのは、「コードを読めるかどうか」と「コードのリスクを判断できるかどうか」は別物になったということです。以前は、ライブラリの仕様変更に詳しい人にしかレビューを頼めませんでしたが、今は「このコードに古い書き方や非推奨の関数が残っていないか確認して」とClaude Codeに投げれば、要点を日本語で説明してもらえます。
これにより、経営者やプロジェクト管理者がコードの中身を直接読まなくても、リスクの有無を把握したうえで意思決定できる体制に近づきます。もちろん最終的な技術判断はエンジニアが担うべきですが、「そもそも確認する仕組みがあるかどうか」という一段階目のガバナンスは、非エンジニアの経営者でも十分に設計できる領域です。
6-2. ライブラリのバージョンアップ対応も相談できる
PyYAMLのyaml.load()の例のように、ライブラリのバージョンアップによって、以前は動いていたコードが動かなくなるケースは珍しくありません。こうした変更への追従も、Claude Codeに「このエラーはライブラリのバージョンが原因か確認して」と伝えるだけで、公式ドキュメントの変更点を踏まえた回答が得られます。
社内に専任のインフラ担当がいない中小企業ほど、こうした「地味だが放置すると危険な作業」が後回しになりがちです。機械的なチェックを日常の運用に組み込んでおくことが、結果的に最も費用対効果の高いリスク管理になります。
07 CONCLUSION まとめ ── 「動く」と「安全」は別の基準 基本を正しく押さえたうえで、組織としてのリスク管理を両立させる
この記事では、PyYAMLでYAMLファイルを読み書きする基本から、yaml.loadとsafe_loadの違い、dumpの書式オプション、そしてそれが経営リスクにつながる構造までを整理しました。最後にポイントを振り返ります。
yaml(パッケージ名はpyyaml)yaml.safe_load()が基本。古いyaml.load(file)はPyYAML 5.4以降エラーになるyaml.dump(data, file, allow_unicode=True, default_flow_style=False)が基本形PyYAMLのyaml.loadは、書き方自体はシンプルですが、「動く」と「安全に動く」の間にギャップがある典型例です。このギャップを個人の注意力だけで埋め続けるのではなく、機械的なチェックを組み合わせて組織としてリスクを減らす、という発想が重要になります。
YAMLに限らず、外部データを取り込んで処理する仕組みは、ほとんどのシステムに存在します。「安全な関数を選ぶ」という基本を徹底したうえで、バージョンアップや仕様変更への追従を仕組みとして継続することが、長期的に事故を防ぐ一番の近道になります。
次にYAMLファイルを扱うコードを書く、あるいはレビューする機会があれば、この記事で紹介したLoaderの対応表とdumpのオプション一覧を見返してみてください。細部の積み重ねが、動くコードと安全なコードの差になります。
コードのリスクチェックを、Claude Codeで仕組み化しませんか
安全でないライブラリの使い方のような細かいリスクを、個人の注意力だけに頼らない体制づくりを支援します。
弊社の実運用ノウハウをベースに、個別に導入設計のご相談を承ります。
ここから先の進め方は、大きく2つあります。
自社で回せるようになりたい方は、AI鬼管理でClaude Code/Codexの使い方から業務設計・社内定着まで伴走を受けながら、社内に仕組みを作る道があります。
覚えるより任せたい方は、AI社員AIKATAでこの記事のような定型業務を丸ごと預ける道があります。料金は月30万円の月額定額、追加費用は0円です。
どちらが合うかは、業務量と社内体制次第です。無料相談・無料適合診断で、貴社の場合はどちらが向くかからご相談いただけます。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. yaml.load(file)を実行するとエラーになるのはなぜですか?
A. PyYAML 5.4以降、Loader引数が必須になったためです。以前はLoaderを省略すると内部的に安全でない変換ルールが使われていましたが、セキュリティ上のリスクがあるため、明示的な指定が必須化されました。
Q. yaml.safe_loadとyaml.FullLoaderはどちらを使うべきですか?
A. 基本的にはyaml.safe_load()を推奨します。日付型など一部の複雑な型を扱う必要がある場合のみyaml.FullLoaderの使用を検討してください。UnsafeLoader(yaml.Loader)は信頼できるデータにのみ使用すべきです。
Q. yaml.dumpで日本語が文字化けのように見えるのはなぜですか?
A. allow_unicode=Trueを指定していないと、日本語などの非ASCII文字がエスケープシーケンス形式で出力されるためです。文字化けではなく正しいエンコードですが、人間が読むには不便なので、allow_unicode=Trueを指定してください。
Q. default_flow_styleを指定しないとどうなりますか?
A. PyYAMLのバージョンによって既定の出力形式が異なる可能性があるため、意図しない形式で出力される場合があります。ブロックスタイル・フロースタイルのどちらを使うかは明示的に指定することを推奨します。
Q. YAMLファイルの読み込みでセキュリティリスクがあるのは、なぜPythonのpickleと似ているのですか?
A. どちらも「文字列やファイルの内容をプログラムのオブジェクトに復元する(デシリアライズする)」処理である点が共通しているためです。復元の過程で任意のコードが実行される仕組みを悪用されると、攻撃者にプログラムを乗っ取られるリスクがあります。
Q. 非エンジニアの経営者は、こうしたライブラリの細部をどこまで理解すべきですか?
A. コードを1行ずつ読む必要はありませんが、「バージョンアップで安全性の基準が変わることがある」という構造は理解しておくべきです。そのうえで、Claude Codeなどによる機械的なレビュー体制を組織としてどう作るかを判断するのが経営者の役割です。
Q. YAMLのアンカー・エイリアスはどんな場面で特に役立ちますか?
A. 同じ設定値を複数のサービス・環境で繰り返し使う場面、例えばCI/CDパイプラインの共通設定や、複数のサーバー設定で同じデフォルト値を使い回す場面で特に効果を発揮します。修正が必要な時もアンカー側を1箇所直すだけで済みます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AI社員AIKATAへのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




