Claudeチャットを資産化!エクスポートデータを整形するPythonツール

Development
スポンサーリンク

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ツールの概要

機能

  1. ファイル選択ダイアログ: GUIでJSONファイルを選択
  2. エンコーディング自動判定: UTF-8/Shift-JIS両対応
  3. タイムスタンプ付きフォルダ作成: output/yyyymmdd_hhmmss/形式
  4. チャット毎に分割: 各チャットを個別のMarkdownファイルに出力
  5. ファイル名の安全化: 使えない文字を自動置換

プロジェクト構成

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.db

README.md

# Claude Chat Exporter

ClaudeのエクスポートJSONを整形してMarkdownファイルに出力

## 使い方

```bash
python exporter.py
  1. ファイル選択ダイアログでJSONファイルを選択
  2. 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から実行

  1. exporter.py を開く
  2. 右上の「▶」ボタンをクリック(または F5 でデバッグ実行)
  3. ファイル選択ダイアログが表示される

コマンドラインから実行

cd C:\my-local\my-python\claude_chat_exporter
python exporter.py

3. 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でのデバッグ実行

初回実行時の設定

  1. F5 キーを押す
  2. 「Python Debugger」を選択
  3. 「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リポジトリ作成の2つの方法:GUI vs CLI徹底比較
GitHubでリポジトリを作成する方法は大きく分けて2つあります。ブラウザを使ったGUI操作と、GitHub CLIを使ったコマンドライン操作です。この記事では、実際のPythonプロジェクトを例に、両方の方法を詳しく解説します。前提条件G...
  • GitHub CLI完全ガイド:コマンドラインでGitHub操作を効率化
GitHub CLI完全ガイド:コマンドラインでGitHub操作を効率化
GitHub CLI(ghコマンド)は、GitHubの操作をコマンドラインで完結できる公式ツールです。ブラウザを開かずに、リポジトリ作成からIssue管理、Pull Request作成まで、すべてターミナルで行えます。この記事では、実際の導...

クイックスタート

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リポジトリ作成の2つの方法:GUI vs CLI徹底比較
GitHubでリポジトリを作成する方法は大きく分けて2つあります。ブラウザを使ったGUI操作と、GitHub CLIを使ったコマンドライン操作です。この記事では、実際のPythonプロジェクトを例に、両方の方法を詳しく解説します。前提条件G...
  • GitHub CLI完全ガイド:コマンドラインでGitHub操作を効率化
GitHub CLI完全ガイド:コマンドラインでGitHub操作を効率化
GitHub CLI(ghコマンド)は、GitHubの操作をコマンドラインで完結できる公式ツールです。ブラウザを開かずに、リポジトリ作成からIssue管理、Pull Request作成まで、すべてターミナルで行えます。この記事では、実際の導...

コメント