Pythonの辞書をファイルに保存・読み込む方法(pickle / json)初心者向け完全ガイド
生徒
「Pythonで作った辞書をファイルに保存して、あとでまた読み込みたいのですが、どうすればいいですか?」
先生
「Pythonではpickleとjsonという2つの方法が代表的です。それぞれ特徴がありますよ。」
生徒
「pickleとjsonって何が違うんですか?」
先生
「pickleはPython専用の保存形式で、jsonは人間が読めるテキスト形式です。それぞれの使い方を順番に説明しますね!」
1. pickleで辞書を保存・読み込む(Python専用のシリアライズ)
pickle(ピックル)は、Pythonのデータを「そのままの状態」で丸ごと保存できる、非常に便利な機能です。最大の特徴は、辞書の中に数値、文字列、リストなどが混ざっていても、Pythonのデータ型を維持したまま保存・復元ができる点にあります。
初心者の方が特につまずきやすいポイントは、保存時のファイルモードです。pickleはテキストではなく「バイナリ形式(機械が読みやすい形式)」で書き出すため、"wb"(書き込み)や"rb"(読み込み)のように、末尾にbを付ける必要があります。
import pickle
# 保存したい辞書データ(プログラミング未経験の方でも分かりやすい名簿を例にします)
user_info = {
"名前": "田中",
"年齢": 28,
"趣味": ["読書", "旅行"],
"ステータス": {"会員": True, "ポイント": 1500}
}
# 1. 辞書をファイルに保存する(dump)
# "wb" は Write Binary(バイナリ形式で書き込む)という意味です
with open("user_data.pkl", "wb") as f:
pickle.dump(user_info, f)
print("ファイルの保存が完了しました。")
# 2. 保存したファイルを読み込む(load)
# "rb" は Read Binary(バイナリ形式で読み込む)という意味です
with open("user_data.pkl", "rb") as f:
loaded_data = pickle.load(f)
print("--- 読み込んだデータを表示します ---")
print(loaded_data)
# データの型も保持されているか確認
print(f"データの型: {type(loaded_data)}")
ファイルの保存が完了しました。
--- 読み込んだデータを表示します ---
{'名前': '田中', '年齢': 28, '趣味': ['読書', '旅行'], 'ステータス': {'会員': True, 'ポイント': 1500}}
データの型: <class 'dict'>
このように、複雑な階層構造を持つ辞書でも、pickle.dump()とpickle.load()を使うだけで、元の形を崩さずに再利用できます。
注意点: pickleで保存されたファイルは、人間がメモ帳などで開いても中身を読むことはできません。また、Python以外のプログラミング言語(PHPやJavaScriptなど)では基本的に読み込めないため、自分専用のプログラムやPython同士の連携で使うのが一般的です。
2. JSON形式で辞書データを保存・読み込む方法
Pythonでデータを保存する際、最も汎用性が高くおすすめなのがJSON(ジェイソン)形式です。「JavaScript Object Notation」の略で、テキストファイルとして中身を直接確認できるため、初心者の方でも扱いやすいのが特徴です。
設定ファイルやWeb APIなど、Python以外の言語(JavaScriptやPHPなど)ともデータをやり取りできるため、実務でも頻繁に使用されます。ここでは、辞書データをファイルに書き出す「保存」と、ファイルからデータを取り出す「読み込み」の基本コードを見ていきましょう。
import json
# 保存したい辞書データ(名前、年齢、リスト形式の趣味)
user_data = {
"名前": "佐藤",
"年齢": 34,
"趣味": ["音楽", "料理", "キャンプ"]
}
# 1. ファイルへの保存(書き込み)
# open関数で 'w' (write) モードを指定します
with open("user_info.json", "w", encoding="utf-8") as f:
# indent=4 を入れることで、人間が読みやすいように改行・字下げされます
# ensure_ascii=False は、日本語を文字化けさせないための必須設定です
json.dump(user_data, f, ensure_ascii=False, indent=4)
print("保存が完了しました。")
# 2. ファイルからの読み込み
# open関数で 'r' (read) モードを指定します
with open("user_info.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
print("読み込んだデータの内容:")
print(loaded_data)
{
"名前": "佐藤",
"年齢": 34,
"趣味": [
"音楽",
"料理",
"キャンプ"
]
}
初心者が押さえておくべきポイント
JSON操作でよくある「日本語が \u4f50\u85e4 のように化けてしまう」トラブルを防ぐには、ensure_ascii=False の指定が非常に重要です。また、indent=4 を指定することで、メモ帳などで開いた際に階層構造が分かりやすくなり、データのチェックや修正が格段にスムーズになります。
3. pickleとjsonの違い:どっちを使うべき?
Pythonでデータを保存する際、「pickle」と「json」のどちらを使うべきか迷うことがあります。結論から言うと、「Pythonだけで完結するか、他のプログラム(JavaScriptやPHPなど)でも使うか」が最大の判断基準です。
pickle(ピクルス)
- Python専用:Python以外では開けません。
- 丸ごと保存:独自のクラスや複雑な計算結果もそのまま保存可能。
- バイナリ形式:メモ帳で開いても中身は読めません。
JSON(ジェイソン)
- 世界標準:Webサイトやスマホアプリなど、言語を問わず使えます。
- テキスト形式:メモ帳で開けば、人間が中身を読んで修正できます。
- 安全性が高い:悪意のあるプログラムが混入しにくい形式です。
初心者向け比較サンプルコード
例えば、ユーザーの名前と年齢を保存する場合の違いを見てみましょう。
import json
import pickle
# 保存したいデータ(辞書型)
user_data = {"name": "田中", "age": 25}
# JSONで保存する場合(人間が見てわかるテキスト)
json_data = json.dumps(user_data, ensure_ascii=False)
print(f"JSONの見た目: {json_data}")
# pickleで保存する場合(コンピューター専用のバイナリ)
pickle_data = pickle.dumps(user_data)
print(f"pickleの見た目: {pickle_data}")
使い分けのコツ:
ゲームのセーブデータや一時的な計算状態を保存して、後で自分のPythonプログラムで再開するならpickleが楽です。一方で、Webアプリの設定ファイルや、誰かと共有するデータを作るならJSONを選びましょう。
4. 応用:複数の辞書データをまとめて一括保存する方法
これまでは1つのデータ(辞書)の扱いを見てきましたが、実際のアプリ開発やデータ分析では、「複数のデータ」をまとめて保存したい場面がほとんどです。 例えば、名簿のように「名前と年齢」のセットが何人分もある場合、それらを「リスト([ ])」の中に並べて入れることで、1つのJSONファイルとして整理して保存できます。
プログラミング未経験の方でも分かりやすいように、複数のユーザー情報をリストにまとめ、ファイルに書き出す流れを確認してみましょう。
import json
# 1. 複数の辞書(ユーザー情報)をリストにまとめる
user_list = [
{"名前": "山田 太郎", "年齢": 25, "趣味": "登山"},
{"名前": "鈴木 花子", "年齢": 30, "趣味": "読書"},
{"名前": "佐藤 健一", "年齢": 22, "趣味": "映画鑑賞"}
]
# 2. まとめてJSONファイルに保存
# indent=4 を指定すると、人間が見やすいように段落(インデント)が付きます
with open("users.json", "w", encoding="utf-8") as f:
json.dump(user_list, f, ensure_ascii=False, indent=4)
# 3. 保存したファイルを読み込んで中身を確認
with open("users.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
# 読み込んだリストを表示
print(loaded_data)
json.dump()を使う際、indent=4という設定を加えるのがプロのコツです。これを入れるだけで、保存されたテキストファイルが自動で改行され、初心者の方でも中身をパッと見て理解できる「きれいな形式」で保存されます。
実行結果を確認すると、リスト形式([ ])の中に、それぞれの辞書データが正しく格納されていることがわかります。この方法を使えば、100人、1000人とデータが増えても、たった数行のコードで効率的に管理することが可能です。
[{'名前': '山田 太郎', '年齢': 25, '趣味': '登山'}, {'名前': '鈴木 花子', '年齢': 30, '趣味': '読書'}, {'名前': '佐藤 健一', '年齢': 22, '趣味': '映画鑑賞'}]
5. 実務での注意点
pickleはセキュリティ上、信頼できないファイルを読み込むと危険な場合があります。jsonは安全ですが、日付やPython特有のオブジェクトはそのままでは保存できません。
業務で使う場合は、データの性質と利用環境を考えて適切な方法を選びましょう。
まとめ
Python で辞書データを保存したり読み込んだりする作業は、プログラムを書いていくうえで非常に重要な基礎になります。特に辞書型は、ユーザー情報、設定データ、アプリの状態などをまとめて扱えるため、保存方法を理解しておくと実務でも学習でも大きく役立ちます。今回の記事では、Python の代表的な保存方法である pickle と json の2つを比較しながら、それぞれの特徴や使い方を丁寧に確認してきました。どちらも辞書の保存に使えますが、保存形式や使える場面が異なるため、目的に応じて正しく選ぶことがとても大切です。
まず、pickle は Python 専用のバイナリ形式であり、数値や文字列だけでなくリストや辞書を含む複雑なデータ構造をそのままの形で保存できる強力な仕組みです。型の情報も完全に保持されるため、そのまま保存してそのまま読み込めますが、その一方でPython 以外の言語とは互換性がないことが特徴です。実務や学習環境で長期間保存するデータや、別システムで読み取る可能性があるデータには向きません。しかし、Python 内だけですぐに保存してすぐ読み込むような場合には「一番手軽で元のまま扱える」という大きな利点があります。
一方で json はテキスト形式で人間にも読みやすく、他の言語とも互換性があるという点で非常に汎用性の高い保存方法です。特に Web API やフロントエンドとのやり取り、外部サービスへの送受信など、Python 以外の環境と連携する場面では json が標準的な形式となっています。また、ファイルがシンプルなテキストのため git などでの管理にも適しています。ただし json は Python の辞書とは完全に同じ構造を扱えるわけではなく、日付型や一部のオブジェクトなどはそのまま保存できないという制約もあります。今回の例でもensure_ascii=False を使うことで日本語を問題なく保存できることを確認しました。
辞書データを安全かつ確実に保存するには、「保存したいデータの性質」と「そのデータを使う環境」を正しく理解したうえで pickle と json を選び分けることが重要です。短期間の保存や Python 内で完結する処理なら pickle が便利であり、他の言語とやり取りしたり設定ファイルとして再利用するなら json が最適です。また、複数の辞書を扱う場合には、それらをリストにまとめて保存する方法が効率的で、読み込み後も扱いやすくなります。
さらに実務においては、pickle の読み込みが危険になるケースがあることも押さえておく必要があります。pickle ファイルは Python のオブジェクトを復元する際に任意コードが実行される可能性があるため、信頼できないファイルは絶対に読み込まないようにすることが大切です。一方で json は内容が可視化されているぶん、セキュリティリスクが低く、広い場面で利用されています。しかし json も万能ではなく、データの種類によっては追加加工が必要になることもあります。用途に合わせた柔軟なデータ管理が求められます。
ここまでの内容を踏まえ、辞書をファイルに保存する基本パターンをひとつのサンプルコードとしてまとめてみました。pickle と json のどちらも使えるようになると、データ管理の幅が一気に広がり、アプリケーション開発や学習の効率が大きく向上します。
import pickle
import json
# 共通で使う辞書データ
profile = {
"名前": "山本",
"年齢": 32,
"趣味": ["釣り", "料理"],
"有効": True
}
# pickleで保存
with open("profile.pkl", "wb") as f:
pickle.dump(profile, f)
# pickleで読み込み
with open("profile.pkl", "rb") as f:
loaded_pickle = pickle.load(f)
print("pickle読み込み:", loaded_pickle)
# jsonで保存
with open("profile.json", "w", encoding="utf-8") as f:
json.dump(profile, f, ensure_ascii=False, indent=4)
# jsonで読み込み
with open("profile.json", "r", encoding="utf-8") as f:
loaded_json = json.load(f)
print("json読み込み:", loaded_json)
このように、pickle と json はどちらも辞書を保存するための便利な選択肢ですが、用途や環境に応じて賢く使い分けることで Python のデータ管理がより快適になります。辞書はアプリの構造や設定を保持するための基本的なデータ型であるため、保存方法の理解はそのままスキルアップにつながります。特にデータの永続化や外部との連携を行うプログラムを書きたい場合には、pickle と json の特徴や安全性、扱い方をしっかり押さえておくことで、トラブルを避けながら堅実な開発ができるようになります。
また、実務の現場では、データの形式が増えたり、システム間でやり取りされる構造が複雑になったりすることも少なくありません。そうした場合にも、辞書の保存方法を理解していれば、適切なフォーマットを選んで安全かつ効率よく処理ができます。pickle と json は Python 初心者が最初に学ぶデータ保存技術として最適であり、理解しておくと後の学習がとてもスムーズになります。今回学んだ知識を活かしながら、実際のプログラムでもぜひ試してみてください。
生徒
「pickle と json の違いがよくわかりました。最初はどっちを使えばいいのか迷っていたのですが、今回の説明で用途がはっきりしました!」
先生
「それはよかったです。それぞれの特徴を理解しておけば、保存したいデータの内容や使う環境に応じて正しく選べるようになりますよ。」
生徒
「json が他の言語でも扱えるというのは、たしかにいろいろな場面で使えそうですね。Web アプリでデータをやり取りするときとか便利そうです。」
先生
「その通りです。逆に Python だけで閉じた処理なら pickle がとても楽ですよ。型の情報まで全部保存できるので、再現性が高いんです。」
生徒
「でも pickle は信頼できるデータじゃないと危険、という点も覚えておかないとですね。」
先生
「うん、その点は重要です。pickle は安全に扱える場面で使い、外部とのやり取りがある場合には json を中心に使うのが基本です。」
生徒
「複数の辞書をリストでまとめて保存する方法も役に立ちそうです。データベースみたいに扱えますね!」
先生
「そうですね。辞書やリストを組み合わせることで、多くの情報を柔軟に扱えるようになります。今回学んだことをいろんなコードで試してみてください。」