Claudeとの会話履歴は貴重な知的財産です。しかし、エクスポートしたJSONファイルは読みにくく、そのままでは活用しづらいのが現状です。この記事では、ClaudeのエクスポートデータをMarkdown形式に整形し、チャット毎に分割して保存するPythonツールを紹介します。
なぜClaudeチャットを管理するのか?
Claudeとの会話には、以下のような価値があります:
- 問題解決の過程: エラー解決やトラブルシューティングの記録
- 学習内容: 新しい技術や概念の理解プロセス
- アイデアの発展: プロジェクトの企画や設計の議論
- コードレビュー: 実装の改善提案や最適化の議論
これらを適切に管理することで:
- 後から見返して復習できる
- 同じ問題に再度直面したときに参照できる
- チーム内で知識を共有できる
- ブログ記事や技術文書の素材になる
Claudeチャットのエクスポート方法
ステップ1: Claudeチャット画面を開く
https://claude.ai にアクセスし、エクスポートしたい会話を開きます。
ステップ2: エクスポートメニューを表示
画面右上の「︙」(3点リーダー)をクリックし、「Export chat」を選択します。
ステップ3: JSON形式でダウンロード
「Download as JSON」を選択すると、JSONファイルがダウンロードされます。
ファイル名例: claude_conversations_2026-01-31.json
エクスポートデータの構造
エクスポートしたJSONファイルは以下のような構造になっています:
[
{
"uuid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "チャットのタイトル",
"created_at": "2026-01-31T10:00:00.000Z",
"updated_at": "2026-01-31T12:00:00.000Z",
"chat_messages": [
{
"uuid": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"text": "メッセージ内容",
"sender": "human",
"created_at": "2026-01-31T10:00:00.000Z"
},
{
"uuid": "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
"text": "Claudeの返答",
"sender": "assistant",
"created_at": "2026-01-31T10:01:00.000Z"
}
]
}
]このままでは読みにくいため、整形ツールが必要です。
Pythonツールの概要
機能
- ファイル選択ダイアログ: GUIでJSONファイルを選択
- エンコーディング自動判定: UTF-8/Shift-JIS両対応
- タイムスタンプ付きフォルダ作成:
output/yyyymmdd_hhmmss/形式 - チャット毎に分割: 各チャットを個別のMarkdownファイルに出力
- ファイル名の安全化: 使えない文字を自動置換
プロジェクト構成
C:\my-local\my-python\
├── claude_chat_exporter/
│ ├── exporter.py # メインスクリプト
│ ├── README.md # 使い方説明
│ └── output/ # 出力先(自動生成)
│ └── 20260131_120000/ # タイムスタンプフォルダ
│ ├── チャット1.md
│ ├── チャット2.md
│ └── ...
├── .gitignore
├── README.md
└── requirements.txtソースコード
exporter.py
import json
import tkinter.filedialog as fd
from datetime import datetime
from pathlib import Path
import re
p = fd.askopenfilename(filetypes=[("JSON files", "*.json")])
if not p: exit()
# JSONファイル読み込み
try:
d = json.load(open(p, 'r', encoding='utf-8'))
except:
d = json.load(open(p, 'r', encoding='cp932'))
# 出力フォルダ作成(pyファイルと同じ場所/output/yyyymmdd_hh24miss)
output_dir = Path(__file__).parent / 'output' / datetime.now().strftime('%Y%m%d_%H%M%S')
output_dir.mkdir(parents=True, exist_ok=True)
# チャット毎にファイル出力
for i, c in enumerate(d):
# タイトル取得(なければ chat_N)
title = c.get('name', f'chat_{i}')
# ファイル名に使えない文字を除去
filename = re.sub(r'[\\/:*?"<>|]', '_', title) + '.md'
# Markdownファイルに出力
with open(output_dir / filename, 'w', encoding='utf-8') as f:
# タイトルを見出しとして出力
f.write(f"# {title}\n\n")
# メッセージを順番に出力
for m in c.get('chat_messages', []):
f.write(f"**[{m['sender']}]**:\n\n{m['text']}\n\n") # human または assistant
print(f"出力完了: {output_dir}").gitignore
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
.venv/
# 出力ファイル
*/output/
*.json
# IDE
.vscode/
.idea/
# OS
.DS_Store
Thumbs.dbREADME.md
# Claude Chat Exporter
ClaudeのエクスポートJSONを整形してMarkdownファイルに出力
## 使い方
```bash
python exporter.py- ファイル選択ダイアログでJSONファイルを選択
output/yyyymmdd_hhmmss/にチャット毎のmdファイルが出力される
出力例
output/
└── 20260131_120000/
├── GitHubリポジトリ作成手順.md
├── Python開発環境構築.md
└── VSCodeデバッグ使い方.md
## 使い方
### 1. プロジェクトフォルダ作成
```bash
# フォルダ作成
mkdir C:\my-local\my-python\claude_chat_exporter
cd C:\my-local\my-python\claude_chat_exporter
# Pythonスクリプト作成
# 上記のexporter.pyの内容をコピーVSCodeで exporter.py を作成し、上記のコードを貼り付けます。
2. Pythonスクリプトを実行
VSCodeから実行
exporter.pyを開く- 右上の「▶」ボタンをクリック(または
F5でデバッグ実行) - ファイル選択ダイアログが表示される
コマンドラインから実行
cd C:\my-local\my-python\claude_chat_exporter
python exporter.py3. JSONファイルを選択
ファイル選択ダイアログで、ClaudeからエクスポートしたJSONファイルを選択します。
4. 出力確認
# 出力フォルダを確認
dir output\20260131_120000各チャットが個別のMarkdownファイルとして出力されます。
出力例
出力ファイル: GitHubリポジトリ作成手順.md
# GitHubリポジトリ作成手順
**[human]**:
GitHubにリポジトリを作成する方法を教えて
**[assistant]**:
GitHubにリポジトリを作成する方法は2つあります...
**[human]**:
GitHub CLIを使った方法を詳しく教えて
**[assistant]**:
GitHub CLIを使うと、コマンドラインで簡単にリポジトリを作成できます...コードの解説
ファイル選択ダイアログ
p = fd.askopenfilename(filetypes=[("JSON files", "*.json")])
if not p:
exit()tkinter.filedialogを使用してGUIでファイル選択.jsonファイルのみフィルタ- キャンセル時は終了
エンコーディング自動判定
try:
d = json.load(open(p, 'r', encoding='utf-8'))
except:
d = json.load(open(p, 'r', encoding='cp932'))- まずUTF-8で読み込みを試行
- 失敗したらShift-JIS(cp932)で再試行
- 日本語環境での互換性確保
タイムスタンプ付きフォルダ作成
output_dir = Path(__file__).parent / 'output' / datetime.now().strftime('%Y%m%d_%H%M%S')
output_dir.mkdir(parents=True, exist_ok=True)Path(__file__).parent: スクリプトと同じ場所datetime.now().strftime('%Y%m%d_%H%M%S'):20260131_120000形式parents=True: 親フォルダも自動作成exist_ok=True: 既存フォルダでもエラーにしない
ファイル名の安全化
filename = re.sub(r'[\\/:*?"<>|]', '_', title) + '.md'- Windowsで使えない文字(
\ / : * ? " < > |)を_に置換 .md拡張子を追加
Markdown形式で出力
f.write(f"# {title}\n\n")
for m in c.get('chat_messages', []):
f.write(f"**[{m['sender']}]**:\n\n{m['text']}\n\n")- タイトルは
# タイトル形式(見出し1) - 送信者は
**[sender]**:形式(太字) - メッセージ間は空行で区切る
VSCodeでのデバッグ実行
初回実行時の設定
F5キーを押す- 「Python Debugger」を選択
- 「Pythonファイル 現在アクティブなPythonファイルをデバッグする」を選択
デバッグの活用
ブレークポイントを設定して動作を確認:
# ①ファイルが読めたか確認
d = json.load(...) # ←ここに●
# ②チャット数とタイトル確認
for i, c in enumerate(d): # ←ここに●
title = c.get('name', f'chat_{i}')
# ③ファイル名が正しいか確認
filename = re.sub(...) # ←ここに●ブレークポイント設定方法:
- 行番号の左側をクリック → 赤丸が表示
F10: 次の行へ(ステップオーバー)F11: 関数の中に入る(ステップイン)F5: 続行
GitHub連携
このツールをGitHubで管理する方法は、以下の記事で詳しく解説しています:
- GitHubリポジトリ作成の2つの方法:GUI vs CLI徹底比較

- GitHub CLI完全ガイド:コマンドラインでGitHub操作を効率化

クイックスタート
cd C:\my-local\my-python
# Git初期化
git init
git add .
git commit -m "Initial commit: Add claude_chat_exporter"
# GitHubにプッシュ(GitHub CLI使用)
gh repo create my-python --private --source=. --push応用例
1. バッチ処理
複数のJSONファイルを一度に処理:
import glob
# すべてのJSONファイルを取得
json_files = glob.glob("exports/*.json")
for json_file in json_files:
# 処理ロジック
...2. カテゴリ分類
チャットタイトルに基づいて自動分類:
# タイトルにキーワードが含まれていたらフォルダ分け
if "Python" in title:
category_dir = output_dir / "Python"
elif "GitHub" in title:
category_dir = output_dir / "GitHub"
else:
category_dir = output_dir / "Others"
category_dir.mkdir(exist_ok=True)3. 日付フィルタリング
特定期間のチャットのみ抽出:
from datetime import datetime, timedelta
# 過去7日間のチャットのみ
cutoff_date = datetime.now() - timedelta(days=7)
for c in d:
created = datetime.fromisoformat(c['created_at'].replace('Z', '+00:00'))
if created > cutoff_date:
# 処理
...トラブルシューティング
エラー1: ModuleNotFoundError: No module named 'tkinter'
原因: Pythonインストール時にtkinterが含まれていない
解決方法:
- Windows: Python再インストール時に「tcl/tk and IDLE」にチェック
- macOS:
brew install python-tk - Linux:
sudo apt install python3-tk
エラー2: UnicodeDecodeError
原因: JSONファイルのエンコーディングが想定外
解決方法: コードが自動判定するため通常は発生しません。発生した場合は以下を試してください:
# エンコーディングを明示的に指定
d = json.load(open(p, 'r', encoding='utf-8-sig')) # BOM付きUTF-8エラー3: 出力フォルダが作成されない
原因: 権限不足
解決方法:
- 管理者権限でVSCodeを実行
- または、書き込み可能なフォルダに移動
まとめ
このツールを使うことで:
- ✅ Claudeチャットを読みやすいMarkdown形式で保存
- ✅ チャット毎に分割して管理しやすく
- ✅ タイムスタンプ付きで履歴管理
- ✅ GitHubで バージョン管理
Claudeとの会話は貴重な知的財産です。このツールを使って、効率的に管理・活用してください。
関連記事
- GitHubリポジトリ作成の2つの方法:GUI vs CLI徹底比較

- GitHub CLI完全ガイド:コマンドラインでGitHub操作を効率化

コメント