<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ツール開発 - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/%e3%83%84%e3%83%bc%e3%83%ab%e9%96%8b%e7%99%ba/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Thu, 19 Feb 2026 05:34:39 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://caymezon.com/wp-content/uploads/2026/01/cropped-CayTechLab-32x32.jpg</url>
	<title>ツール開発 - CayTech Lab</title>
	<link>https://caymezon.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://caymezon.com/?pushpress=hub'/>
	<item>
		<title>Claude Codeセッションログを一括MD化！拡張版エクスポーターで開発記録を資産化</title>
		<link>https://caymezon.com/claude-code-session-exporter/</link>
					<comments>https://caymezon.com/claude-code-session-exporter/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sun, 15 Feb 2026 04:33:55 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ツール開発]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20143</guid>

					<description><![CDATA[<p>Claude Codeで開発を進めると、セッション毎に貴重なやり取りが蓄積されていきます。しかし、そのログファイル（JSONL形式）は人間が読める形式ではありません。この記事では、以前紹介したClaude Chat Ex [&#8230;]</p>
<p>The post <a href="https://caymezon.com/claude-code-session-exporter/">Claude Codeセッションログを一括MD化！拡張版エクスポーターで開発記録を資産化</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Claude Codeで開発を進めると、セッション毎に貴重なやり取りが蓄積されていきます。しかし、そのログファイル（JSONL形式）は人間が読める形式ではありません。この記事では、以前紹介したClaude Chat Exporterを大幅に拡張し、<strong>Claude Codeのセッションログを一括でMarkdown化できる神機能</strong>を実装したツールを紹介します。</p>
<p><!-- ![Claude Codeセッションログのイメージ](images/claude-code-session-logs.jpg) --></p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">なぜClaude Codeのセッションログを管理するのか？</a></li><li><a href="#toc2" tabindex="0">以前のツールとの違い</a><ol><li><a href="#toc3" tabindex="0">新機能一覧</a></li><li><a href="#toc4" tabindex="0">Claude CodeのJSONL形式とは？</a></li></ol></li><li><a href="#toc5" tabindex="0">ツールの全機能</a><ol><li><a href="#toc6" tabindex="0">1. 複数ファイル一括処理</a></li><li><a href="#toc7" tabindex="0">2. JSON/JSONL両対応</a></li><li><a href="#toc8" tabindex="0">3. 賢いフィルタリング</a></li><li><a href="#toc9" tabindex="0">4. セッション識別</a></li><li><a href="#toc10" tabindex="0">5. 安全なファイル名生成</a></li></ol></li><li><a href="#toc11" tabindex="0">使い方</a><ol><li><a href="#toc12" tabindex="0">ステップ1: Claude Codeのセッションログを見つける</a></li><li><a href="#toc13" tabindex="0">ステップ2: エクスポーターを配置</a></li><li><a href="#toc14" tabindex="0">ステップ3: 実行</a></li><li><a href="#toc15" tabindex="0">ステップ4: 出力確認</a></li></ol></li><li><a href="#toc16" tabindex="0">ソースコード全文</a><ol><li><a href="#toc17" tabindex="0">exporter.py</a></li><li><a href="#toc18" tabindex="0">exporter.bat（Windows用）</a></li></ol></li><li><a href="#toc19" tabindex="0">コードの詳細解説</a><ol><li><a href="#toc20" tabindex="0">1. JSONL処理のコア部分</a></li><li><a href="#toc21" tabindex="0">2. 賢いフィルタリング</a></li><li><a href="#toc22" tabindex="0">3. システムタグの除去</a></li><li><a href="#toc23" tabindex="0">4. 配列形式のコンテンツ処理</a></li><li><a href="#toc24" tabindex="0">4. セッション識別</a></li><li><a href="#toc25" tabindex="0">5. 複数ファイル処理</a></li></ol></li><li><a href="#toc26" tabindex="0">出力例</a><ol><li><a href="#toc27" tabindex="0">入力: transcript.jsonl（Claude Codeセッション）</a></li><li><a href="#toc28" tabindex="0">出力: my-project_chat_abc12345.md</a></li></ol></li><li><a href="#toc29" tabindex="0">実際の使用場面</a><ol><li><a href="#toc30" tabindex="0">1. プロジェクト開発の記録</a></li><li><a href="#toc31" tabindex="0">2. トラブルシューティングの記録</a></li><li><a href="#toc32" tabindex="0">3. 学習記録</a></li><li><a href="#toc33" tabindex="0">4. 週次レビュー</a></li><li><a href="#toc34" tabindex="0">5. バックアップと保存</a></li></ol></li><li><a href="#toc35" tabindex="0">応用アイデア</a><ol><li><a href="#toc36" tabindex="0">1. 自動分類スクリプト</a></li><li><a href="#toc37" tabindex="0">2. 統計情報の抽出</a></li><li><a href="#toc38" tabindex="0">3. Obsidian/Notion連携</a></li><li><a href="#toc39" tabindex="0">4. 全文検索インデックス</a></li></ol></li><li><a href="#toc40" tabindex="0">トラブルシューティング</a><ol><li><a href="#toc41" tabindex="0">エラー1: JSONDecodeError</a></li><li><a href="#toc42" tabindex="0">エラー2: セッションIDが見つからない</a></li><li><a href="#toc43" tabindex="0">エラー3: メッセージが含まれていません</a></li><li><a href="#toc44" tabindex="0">エラー4: UnicodeDecodeError</a></li></ol></li><li><a href="#toc45" tabindex="0">まとめ</a></li><li><a href="#toc46" tabindex="0">関連記事</a></li><li><a href="#toc47" tabindex="0">GitHubでの管理</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">なぜClaude Codeのセッションログを管理するのか？</span></h2>
<p>Claude Codeでの開発セッションには、通常のチャット以上の価値があります：</p>
<ul>
<li><strong>実装の全プロセス</strong>: 設計から実装、テスト、デバッグまでの完全な記録</li>
<li><strong>コンテキスト付きの会話</strong>: ファイル編集、コマンド実行の履歴と結果</li>
<li><strong>問題解決の軌跡</strong>: エラーとその解決方法の詳細な記録</li>
<li><strong>アーキテクチャ判断</strong>: 技術選定や設計判断の理由</li>
<li><strong>ベストプラクティス</strong>: Claude Codeとの協働で得られた知見</li>
</ul>
<p>これらを適切に管理することで：</p>
<ul>
<li>✅ プロジェクトの開発履歴として参照できる</li>
<li>✅ 同じ問題に遭遇した時の解決策を即座に見つけられる</li>
<li>✅ チーム内でClaude Code活用のノウハウを共有できる</li>
<li>✅ 技術ブログやドキュメントの素材になる</li>
<li>✅ 開発プロセスの振り返りと改善に活用できる</li>
</ul>
<p><a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BPython%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D22R8A0FYLVMNU%26sprefix%3D%25E6%259C%25AC%2Bpython%252Caps%252C179%26ref%3Dnb_sb_noss_1" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 Python]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"実践Claude Code入門―現場で活用するためのAIコーディングの思考法","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51kkd9SNiVL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297153548","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4297153548","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"lxeQQ","s":"s"});</script></p>
<div id="msmaflink-lxeQQ">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">以前のツールとの違い</span></h2>
<p>以前の記事で紹介した<a href="https://caymezon.com/claude-chat-exporter-tool/">Claude Chat Exporter</a>は、claude.aiのWebチャット用でした。今回の拡張版では、以下の新機能を追加しています：</p>
<h3><span id="toc3">新機能一覧</span></h3>
<table>
<thead>
<tr>
<th>機能</th>
<th>旧バージョン</th>
<th>新バージョン</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>対応形式</strong></td>
<td>JSON（conversations.json）のみ</td>
<td>JSON + JSONL（Claude Code）</td>
</tr>
<tr>
<td><strong>ファイル処理</strong></td>
<td>単一ファイル</td>
<td>複数ファイル一括処理</td>
</tr>
<tr>
<td><strong>入力方法</strong></td>
<td>ダイアログのみ</td>
<td>ダイアログ + ドラッグ&ドロップ + コマンドライン</td>
</tr>
<tr>
<td><strong>セッション識別</strong></td>
<td>チャットタイトルのみ</td>
<td>セッションID + フォルダ名</td>
</tr>
<tr>
<td><strong>メッセージフィルタ</strong></td>
<td>なし</td>
<td>システムメッセージ、ツール結果を自動除外</td>
</tr>
<tr>
<td><strong>コンテンツ処理</strong></td>
<td>シンプルテキスト</td>
<td>配列形式、複雑な構造に対応</td>
</tr>
</tbody>
</table>
<h3><span id="toc4">Claude CodeのJSONL形式とは？</span></h3>
<p>Claude Codeは各セッションのログを <code>.jsonl</code>（JSON Lines）形式で保存します：</p>
<pre><code class="language-plaintext">C:\Users\&lt;ユーザー名&gt;\.claude\sessions\&lt;セッションID&gt;\transcript.jsonl</code></pre>
<p>各行が独立したJSONオブジェクトで、以下のような情報が含まれます：</p>
<pre><code class="language-json">{"type":"user","sessionId":"abc123...","message":{"role":"user","content":"関数を作成して"}}
{"type":"assistant","sessionId":"abc123...","message":{"role":"assistant","content":"承知しました..."}}</code></pre>
<p>この形式は機械的な処理には適していますが、人間が読むには不向きです。</p>
<h2><span id="toc5">ツールの全機能</span></h2>
<h3><span id="toc6">1. 複数ファイル一括処理</span></h3>
<pre><code class="language-bash">exporter.py にファイルを複数ドロップ → 一括処理

# コマンドライン
python exporter.py file1.jsonl file2.json file3.jsonl

# ダイアログ
python exporter.py → 複数ファイル選択可能</code></pre>
<h3><span id="toc7">2. JSON/JSONL両対応</span></h3>
<ul>
<li><strong>JSON</strong>: claude.aiのWebチャットエクスポート（conversations.json）</li>
<li><strong>JSONL</strong>: Claude Codeのセッションログ（transcript.jsonl）</li>
</ul>
<h3><span id="toc8">3. 賢いフィルタリング</span></h3>
<p>自動で不要なメッセージを除外：</p>
<ul>
<li>システムメッセージ（<code>isMeta: true</code>）</li>
<li>ツール実行結果（<code>tool_result</code>タイプ）</li>
<li>コンテキスト情報のみのメッセージ</li>
</ul>
<h3><span id="toc9">4. セッション識別</span></h3>
<p>Claude Codeのセッションログでは：</p>
<ul>
<li>セッションIDの先頭8文字を抽出</li>
<li>フォルダ名も含めて識別</li>
<li>ファイル名: <code>&amp;lt;フォルダ名&amp;gt;_chat_&amp;lt;セッションID&amp;gt;.md</code></li>
</ul>
<p>例：<code>my-project_chat_abc12345.md</code></p>
<h3><span id="toc10">5. 安全なファイル名生成</span></h3>
<p>Windows/Mac/Linuxで使えない文字を自動変換：</p>
<ul>
<li><code>\ / : * ? &amp;quot; &amp;lt; &amp;gt; |</code> → <code>_</code></li>
</ul>
<h2><span id="toc11">使い方</span></h2>
<h3><span id="toc12">ステップ1: Claude Codeのセッションログを見つける</span></h3>
<pre><code class="language-bash"># Windowsの場合
C:\Users\&lt;ユーザー名&gt;\.claude\sessions\

# macOS/Linuxの場合
~/.claude/sessions/</code></pre>
<p>各セッションフォルダ内に <code>transcript.jsonl</code> があります。</p>
<p><!-- ![セッションフォルダの構造](images/session-folder-structure.jpg) --></p>
<h3><span id="toc13">ステップ2: エクスポーターを配置</span></h3>
<pre><code class="language-bash"># フォルダ作成
mkdir C:\my-local\my-python\claude_chat_exporter
cd C:\my-local\my-python\claude_chat_exporter

# スクリプト配置（後述のコードを保存）</code></pre>
<p><strong>Windows ユーザー向け</strong>: ドラッグ&ドロップで実行するために、<code>exporter.bat</code> も作成してください：</p>
<pre><code class="language-bat">@echo off
python "%~dp0exporter.py" %*
pause</code></pre>
<p>このバッチファイルを <code>exporter.py</code> と同じフォルダに保存することで、ファイルをドラッグ&ドロップして実行できるようになります。</p>
<h3><span id="toc14">ステップ3: 実行</span></h3>
<h4>方法1: ドラッグ&ドロップ（一番簡単！）</h4>
<p><strong>Windows の場合</strong>: <code>.py</code> ファイルへのドラッグ&ドロップは関連付けの問題で動作しないことがあります。その場合は <code>exporter.bat</code>（後述）を使用してください。</p>
<ol>
<li>必要な <code>transcript.jsonl</code> ファイルを複数選択</li>
<li><code>exporter.bat</code>（Windows）または <code>exporter.py</code>（Mac/Linux）にドラッグ&ドロップ</li>
<li>自動処理完了！</li>
</ol>
<h4>方法2: ダイアログ</h4>
<pre><code class="language-bash">python exporter.py</code></pre>
<p>ファイル選択ダイアログで複数のJSON/JSONLファイルを選択</p>
<h4>方法3: コマンドライン</h4>
<pre><code class="language-bash"># 単一ファイル
python exporter.py C:\Users\user\.claude\sessions\abc123\transcript.jsonl

# 複数ファイル
python exporter.py session1\transcript.jsonl session2\transcript.jsonl

# ワイルドカード（PowerShell）
python exporter.py (Get-ChildItem -Path "C:\Users\user\.claude\sessions\*\transcript.jsonl" -Recurse).FullName</code></pre>
<h3><span id="toc15">ステップ4: 出力確認</span></h3>
<pre><code class="language-bash"># 出力先
output\20260215_100000\
├── session1_chat_abc12345.md
├── session2_chat_def67890.md
└── project-x_chat_ghi11111.md</code></pre>
<h2><span id="toc16">ソースコード全文</span></h2>
<h3><span id="toc17">exporter.py</span></h3>
<pre><code class="language-python">import json
import sys
import tkinter.filedialog as fd
from datetime import datetime
from pathlib import Path
import re


def clean_system_tags(text):
    """Claude Codeのシステムタグを除去"""
    # システムタグのパターン（開始タグと終了タグのペア）
    paired_tags = [
        r'&lt;ide_selection&gt;.*?&lt;/ide_selection&gt;',
        r'&lt;ide_opened_file&gt;.*?&lt;/ide_opened_file&gt;',
        r'&lt;system-reminder&gt;.*?&lt;/system-reminder&gt;',
        r'&lt;command-name&gt;.*?&lt;/command-name&gt;',
        r'&lt;command-message&gt;.*?&lt;/command-message&gt;',
        r'&lt;command-args&gt;.*?&lt;/command-args&gt;',
        r'&lt;local-command-caveat&gt;.*?&lt;/local-command-caveat&gt;',
        r'&lt;local-command-stdout&gt;.*?&lt;/local-command-stdout&gt;',
    ]

    # 各パターンを除去（DOTALLフラグで改行を含む）
    for pattern in paired_tags:
        text = re.sub(pattern, '', text, flags=re.DOTALL)

    # 連続する空行を1つにまとめる
    text = re.sub(r'\n{3,}', '\n\n', text)

    return text.strip()


def process_jsonl_file(file_path, output_dir):

    """JSONL形式（Claude Codeのログ）の処理"""
    messages = []
    session_id = None

    # 各行を読み込んでパース
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if not line:
                continue

            try:
                entry = json.loads(line)

                # セッションID取得（タイトル用）
                if session_id is None and 'sessionId' in entry:
                    session_id = entry['sessionId']

                # ユーザーまたはアシスタントのメッセージのみ抽出
                if entry.get('type') in ['user', 'assistant'] and 'message' in entry:
                    msg = entry['message']

                    # isMeta=trueのメッセージはスキップ（システムメッセージ）
                    if entry.get('isMeta', False):
                        continue

                    role = msg.get('role', '')
                    content = msg.get('content', '')

                    # contentが配列形式の場合
                    if isinstance(content, list):
                        # tool_resultはスキップ（Task実行結果など）
                        if any(item.get('type') == 'tool_result' for item in content):
                            continue

                        # textタイプのコンテンツのみ抽出（user/assistant共通）
                        text_parts = [item.get('text', '') for item in content if item.get('type') == 'text']
                        content = '\n\n'.join(text_parts)

                    # システムタグを除去
                    content = clean_system_tags(content) if isinstance(content, str) else content

                    if content and role:
                        # roleを表示形式に変換
                        sender = 'human' if role == 'user' else 'assistant'
                        messages.append({'sender': sender, 'text': content})
            except json.JSONDecodeError:
                continue

    # メッセージが1つもない場合はスキップ
    if not messages:
        print(f"スキップ: メッセージが含まれていません ({file_path.name})")
        return

    # フォルダ名とタイトル生成
    folder_name = file_path.parent.name
    if session_id:
        title = f"chat_{session_id[:8]}"
    else:
        title = file_path.stem

    # ファイル名に使えない文字を除去（フォルダ名_タイトル.md）
    safe_folder_name = re.sub(r'[\\/:*?"&lt;&gt;|]', '_', folder_name)
    safe_title = re.sub(r'[\\/:*?"&lt;&gt;|]', '_', title)
    filename = f"{safe_folder_name}_{safe_title}.md"

    # Markdownファイルに出力
    with open(output_dir / filename, 'w', encoding='utf-8') as f:
        f.write(f"# {safe_folder_name}_{safe_title}\n\n")

        for m in messages:
            f.write(f"**[{m['sender']}]**:\n\n{m['text']}\n\n")

    print(f"処理完了: {filename}")


def process_json_file(file_path, output_dir):
    """JSON形式（conversations.json）の処理"""
    try:
        d = json.load(open(file_path, 'r', encoding='utf-8'))
    except:
        d = json.load(open(file_path, 'r', encoding='cp932'))

    # チャット毎にファイル出力
    for i, c in enumerate(d):
        # タイトル取得（なければ chat_N）
        title = c.get('name', f'chat_{i}')

        # フォルダ名を取得
        folder_name = file_path.parent.name
        safe_folder_name = re.sub(r'[\\/:*?"&lt;&gt;|]', '_', folder_name)
        safe_title = re.sub(r'[\\/:*?"&lt;&gt;|]', '_', title)
        filename = f"{safe_folder_name}_{safe_title}.md"

        # Markdownファイルに出力
        with open(output_dir / filename, 'w', encoding='utf-8') as f:
            # タイトルを見出しとして出力
            f.write(f"# {safe_folder_name}_{safe_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"処理完了: {filename}")


def main():
    # 出力フォルダ作成（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)

    # ファイルパスの取得（コマンドライン引数 or ダイアログ）
    if len(sys.argv) &gt; 1:
        # コマンドライン引数またはドラッグ&amp;ドロップから取得
        file_paths = [Path(arg) for arg in sys.argv[1:] if Path(arg).exists()]
        if not file_paths:
            print("エラー: 有効なファイルパスが指定されていません")
            input("Enterキーを押して終了...")
            return
    else:
        # ダイアログで複数ファイル選択
        paths = fd.askopenfilenames(filetypes=[("JSON/JSONL files", "*.json;*.jsonl")])
        if not paths:
            return
        file_paths = [Path(p) for p in paths]

    # 各ファイルを処理
    for file_path in file_paths:
        print(f"\n処理中: {file_path.name}")

        if file_path.suffix == '.jsonl':
            process_jsonl_file(file_path, output_dir)
        elif file_path.suffix == '.json':
            process_json_file(file_path, output_dir)
        else:
            print(f"スキップ: 未対応のファイル形式 ({file_path.name})")

    print(f"\n全ての処理が完了しました")
    print(f"出力先: {output_dir}")
    input("\nEnterキーを押して終了...")


if __name__ == "__main__":
    main()</code></pre>
<h3><span id="toc18">exporter.bat（Windows用）</span></h3>
<pre><code class="language-bat">@echo off
python "%~dp0exporter.py" %*
pause</code></pre>
<p><strong>説明</strong>:</p>
<ul>
<li><code>%~dp0</code>: バッチファイルのあるフォルダパス（末尾に<code>\</code>付き）</li>
<li><code>%*</code>: ドラッグ&ドロップされたすべてのファイルパス</li>
<li><code>pause</code>: 実行後にウィンドウを閉じずに結果を確認できる</li>
</ul>
<h2><span id="toc19">コードの詳細解説</span></h2>
<h3><span id="toc20">1. JSONL処理のコア部分</span></h3>
<pre><code class="language-python">def process_jsonl_file(file_path, output_dir):
    messages = []
    session_id = None

    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            # 各行をJSONとしてパース
            entry = json.loads(line)</code></pre>
<p><strong>ポイント</strong>:</p>
<ul>
<li>JSONL形式は1行=1JSONオブジェクト</li>
<li><code>json.loads()</code>で各行を個別にパース</li>
<li>セッション全体で必要な情報を蓄積</li>
</ul>
<h3><span id="toc21">2. 賢いフィルタリング</span></h3>
<pre><code class="language-python"># システムメッセージを除外
if entry.get('isMeta', False):
    continue

# ツール実行結果を除外
if isinstance(content, list):
    if any(item.get('type') == 'tool_result' for item in content):
        continue</code></pre>
<p><strong>効果</strong>:</p>
<ul>
<li>人間とアシスタントの会話のみを抽出</li>
<li>ファイル編集やコマンド実行の中間結果をスキップ</li>
<li>読みやすい会話ログを生成</li>
</ul>
<h3><span id="toc22">3. システムタグの除去</span></h3>
<pre><code class="language-python">def clean_system_tags(text):
    """Claude Codeのシステムタグを除去"""
    paired_tags = [
        r'&lt;ide_selection&gt;.*?&lt;/ide_selection&gt;',
        r'&lt;system-reminder&gt;.*?&lt;/system-reminder&gt;',
        # ... その他のタグ
    ]

    for pattern in paired_tags:
        text = re.sub(pattern, '', text, flags=re.DOTALL)

    return text.strip()</code></pre>
<p><strong>必要性</strong>:</p>
<ul>
<li>Claude Codeのログには <code>&amp;lt;ide_selection&amp;gt;</code> や <code>&amp;lt;system-reminder&amp;gt;</code> などのシステムタグが含まれる</li>
<li>これらは内部処理用の情報で、会話ログには不要</li>
<li>正規表現で自動除去することで、純粋な会話内容だけを抽出</li>
</ul>
<h3><span id="toc23">4. 配列形式のコンテンツ処理</span></h3>
<pre><code class="language-python">if isinstance(content, list):
    # textタイプのコンテンツのみ抽出（user/assistant共通）
    text_parts = [item.get('text', '') for item in content if item.get('type') == 'text']
    content = '\n\n'.join(text_parts)

# システムタグを除去
content = clean_system_tags(content) if isinstance(content, str) else content</code></pre>
<p><strong>Claude Codeの特性</strong>:</p>
<ul>
<li>user/assistantともに配列形式でメッセージが格納されることがある</li>
<li>ツール使用の説明と結果が分かれて格納される</li>
<li>textタイプのみを抽出して結合することで、会話部分を取得</li>
<li><code>&amp;lt;ide_selection&amp;gt;</code>や<code>&amp;lt;system-reminder&amp;gt;</code>などのシステムタグを自動除去</li>
</ul>
<h3><span id="toc24">4. セッション識別</span></h3>
<pre><code class="language-python"># セッションID取得
if session_id is None and 'sessionId' in entry:
    session_id = entry['sessionId']

# フォルダ名とセッションIDで識別
folder_name = file_path.parent.name
title = f"chat_{session_id[:8]}"
filename = f"{safe_folder_name}_{safe_title}.md"</code></pre>
<p><strong>実用的な識別</strong>:</p>
<ul>
<li>セッションIDだけでは識別困難</li>
<li>フォルダ名（プロジェクト名など）を含めることで識別性向上</li>
<li>先頭8文字のみ使用して簡潔に</li>
</ul>
<h3><span id="toc25">5. 複数ファイル処理</span></h3>
<pre><code class="language-python">if len(sys.argv) &gt; 1:
    # コマンドライン引数またはドラッグ&amp;ドロップ
    file_paths = [Path(arg) for arg in sys.argv[1:] if Path(arg).exists()]
else:
    # ダイアログで複数選択
    paths = fd.askopenfilenames(filetypes=[("JSON/JSONL files", "*.json;*.jsonl")])</code></pre>
<p><strong>利便性</strong>:</p>
<ul>
<li>複数の入力方法に対応</li>
<li>ドラッグ&ドロップで直感的に処理</li>
<li>スクリプト化も可能</li>
</ul>
<h2><span id="toc26">出力例</span></h2>
<h3><span id="toc27">入力: transcript.jsonl（Claude Codeセッション）</span></h3>
<pre><code class="language-jsonl">{"type":"user","sessionId":"abc123def456","message":{"role":"user","content":"Pythonで素数判定関数を作成して"}}
{"type":"assistant","sessionId":"abc123def456","message":{"role":"assistant","content":[{"type":"text","text":"素数判定関数を作成します..."}]}}</code></pre>
<h3><span id="toc28">出力: my-project_chat_abc12345.md</span></h3>
<pre><code class="language-markdown"># my-project_chat_abc12345

**[human]**:

Pythonで素数判定関数を作成して

**[assistant]**:

素数判定関数を作成します...</code></pre>
<h2><span id="toc29">実際の使用場面</span></h2>
<h3><span id="toc30">1. プロジェクト開発の記録</span></h3>
<pre><code class="language-bash"># プロジェクトフォルダのセッションを一括エクスポート
cd C:\Users\user\.claude\sessions
python exporter.py my-web-app\transcript.jsonl api-server\transcript.jsonl</code></pre>
<p><strong>活用方法</strong>:</p>
<ul>
<li>プロジェクト毎の開発履歴を整理</li>
<li>設計判断の理由を後から確認</li>
<li>新メンバーへのオンボーディング資料</li>
</ul>
<h3><span id="toc31">2. トラブルシューティングの記録</span></h3>
<p>エラー解決のセッションを保存：</p>
<pre><code class="language-bash">python exporter.py bug-fix-session\transcript.jsonl</code></pre>
<p><strong>活用方法</strong>:</p>
<ul>
<li>同じエラーが再発した時の解決策を即座に参照</li>
<li>チーム内でトラブル事例を共有</li>
<li>ナレッジベースに追加</li>
</ul>
<h3><span id="toc32">3. 学習記録</span></h3>
<p>新しい技術を学んだセッションを整理：</p>
<pre><code class="language-bash"># Claude Codeで学習したセッションをまとめてエクスポート
python exporter.py react-learning\transcript.jsonl typescript-basics\transcript.jsonl</code></pre>
<p><strong>活用方法</strong>:</p>
<ul>
<li>学習過程を振り返る</li>
<li>理解した内容を復習</li>
<li>ブログ記事の素材</li>
</ul>
<h3><span id="toc33">4. 週次レビュー</span></h3>
<p>1週間のセッションを一括処理：</p>
<pre><code class="language-bash"># PowerShellで過去7日間のセッションを抽出
$sessions = Get-ChildItem -Path "C:\Users\user\.claude\sessions\*\transcript.jsonl" -Recurse |
            Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) }
python exporter.py $sessions.FullName</code></pre>
<p><strong>活用方法</strong>:</p>
<ul>
<li>週の振り返りMTG資料</li>
<li>進捗報告の補助資料</li>
<li>学んだことの整理</li>
</ul>
<h3><span id="toc34">5. バックアップと保存</span></h3>
<p>定期的なバックアップスクリプト：</p>
<pre><code class="language-bash"># バッチファイル例（backup_sessions.bat）
@echo off
set OUTPUT_DIR=D:\claude_backups\%date:~0,4%%date:~5,2%%date:~8,2%
mkdir %OUTPUT_DIR%
python exporter.py C:\Users\user\.claude\sessions\*\transcript.jsonl
move output\* %OUTPUT_DIR%</code></pre>
<h2><span id="toc35">応用アイデア</span></h2>
<h3><span id="toc36">1. 自動分類スクリプト</span></h3>
<pre><code class="language-python"># タグ別にフォルダ分け
import shutil

tag_keywords = {
    'Python': ['python', 'django', 'flask'],
    'JavaScript': ['javascript', 'react', 'node'],
    'Database': ['sql', 'postgres', 'mysql'],
}

for md_file in output_dir.glob('*.md'):
    content = md_file.read_text(encoding='utf-8')

    for tag, keywords in tag_keywords.items():
        if any(kw in content.lower() for kw in keywords):
            tag_dir = output_dir / tag
            tag_dir.mkdir(exist_ok=True)
            shutil.move(md_file, tag_dir / md_file.name)
            break</code></pre>
<h3><span id="toc37">2. 統計情報の抽出</span></h3>
<pre><code class="language-python"># セッションの統計
def analyze_session(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()

    human_msgs = content.count('**[human]**')
    assistant_msgs = content.count('**[assistant]**')
    total_chars = len(content)

    print(f"{file_path.name}:")
    print(f"  人間: {human_msgs}回, Claude: {assistant_msgs}回")
    print(f"  総文字数: {total_chars}")</code></pre>
<h3><span id="toc38">3. Obsidian/Notion連携</span></h3>
<p>Markdown出力なので、そのままObsidianやNotionにインポート可能：</p>
<pre><code class="language-bash"># Obsidian vaultにコピー
cp output/20260215_100000/*.md ~/ObsidianVault/Claude-Sessions/</code></pre>
<h3><span id="toc39">4. 全文検索インデックス</span></h3>
<pre><code class="language-python"># 簡易検索機能
import glob

def search_sessions(keyword, output_dir):
    results = []
    for md_file in Path(output_dir).glob('**/*.md'):
        content = md_file.read_text(encoding='utf-8')
        if keyword.lower() in content.lower():
            results.append(md_file)
    return results

# 使用例
found = search_sessions('素数判定', 'output/20260215_100000')
for f in found:
    print(f"見つかりました: {f.name}")</code></pre>
<h2><span id="toc40">トラブルシューティング</span></h2>
<h3><span id="toc41">エラー1: JSONDecodeError</span></h3>
<p><strong>原因</strong>: JSONL形式が壊れている（途中で保存が中断された等）</p>
<p><strong>解決方法</strong>:</p>
<pre><code class="language-python"># スクリプトは自動でスキップするため、通常は問題なし
except json.JSONDecodeError:
    continue  # 壊れた行はスキップ</code></pre>
<h3><span id="toc42">エラー2: セッションIDが見つからない</span></h3>
<p><strong>症状</strong>: ファイル名が <code>&amp;lt;フォルダ名&amp;gt;_transcript.md</code> になる</p>
<p><strong>原因</strong>: セッションIDが記録されていない（古い形式等）</p>
<p><strong>対処</strong>: ファイル名（transcript）で識別されるため問題なし</p>
<h3><span id="toc43">エラー3: メッセージが含まれていません</span></h3>
<p><strong>原因</strong>: ツール実行結果のみでユーザー/アシスタントの会話がない</p>
<p><strong>対処</strong>: これは正常な動作（処理がスキップされる）</p>
<h3><span id="toc44">エラー4: UnicodeDecodeError</span></h3>
<p><strong>原因</strong>: 特殊な文字が含まれている</p>
<p><strong>解決方法</strong>:</p>
<pre><code class="language-python"># open時にerrors='ignore'を追加
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:</code></pre>
<h2><span id="toc45">まとめ</span></h2>
<p>この拡張版Claude Chat Exporterを使えば：</p>
<ul>
<li>✅ Claude Codeの全セッションを一括でMarkdown化</li>
<li>✅ 読みやすい形式で長期保存・検索可能に</li>
<li>✅ プロジェクトの開発履歴として資産化</li>
<li>✅ チーム内でのナレッジ共有が簡単に</li>
<li>✅ 従来のWebチャットにも引き続き対応</li>
</ul>
<p>Claude Codeを使えば使うほど、貴重な知的財産が蓄積されます。このツールで効率的に管理・活用して、開発の生産性を更に高めましょう。</p>
<p><a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BPython%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D22R8A0FYLVMNU%26sprefix%3D%25E6%259C%25AC%2Bpython%252Caps%252C179%26ref%3Dnb_sb_noss_1" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 Python]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)","b":"インプレス","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51n9WkczYZL._SL500_.jpg","\/41BGvNM3N3L._SL500_.jpg","\/41kGWd9AmpL._SL500_.jpg","\/41vJJZYliRL._SL500_.jpg","\/41odugJRCOL._SL500_.jpg","\/41wohPLSKPL._SL500_.jpg","\/41j-T3ur0-L._SL500_.jpg","\/41dQJDFQ3FL._SL500_.jpg","\/412w5252osL._SL500_.jpg","\/4134qH97BdL._SL500_.jpg","\/41mxalzneRL._SL500_.jpg","\/41Md05JaK1L._SL500_.jpg","\/41M7LTRfJaL._SL500_.jpg","\/416WUwhIelL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4295016365","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4295016365","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BPython%E5%85%A5%E9%96%80%20%E7%AC%AC2%E7%89%88%20(%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BPython%E5%85%A5%E9%96%80%20%E7%AC%AC2%E7%89%88%20(%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"5C5uQ","s":"s"});</script></p>
<div id="msmaflink-5C5uQ">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc46">関連記事</span></h2>
<p>以前のバージョン（Webチャット専用）の解説記事：</p>

<a rel="noopener" href="https://caymezon.com/claude-chat-exporter-tool/" title="Claudeチャットを資産化！エクスポートデータを整形するPythonツール" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/claude-chat-exporter-tool-featured-966f96-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/claude-chat-exporter-tool-featured-966f96-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/claude-chat-exporter-tool-featured-966f96-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/claude-chat-exporter-tool-featured-966f96-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/claude-chat-exporter-tool-featured-966f96-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Claudeチャットを資産化！エクスポートデータを整形するPythonツール</div><div class="blogcard-snippet internal-blogcard-snippet">Claudeとの会話履歴は貴重な知的財産です。しかし、エクスポートしたJSONファイルは読みにくく、そのままでは活用しづらいのが現状です。この記事では、ClaudeのエクスポートデータをMarkdown形式に整形し、チャット毎に分割して保存...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.31</div></div></div></div></a>
<h2><span id="toc47">GitHubでの管理</span></h2>
<p>このツールをGitHubで管理する方法：</p>
<pre><code class="language-bash">cd C:\my-local\my-python\claude_chat_exporter

# .gitignoreを作成
cat &gt; .gitignore &lt;&lt; 'EOF'
# 出力ファイル
output/
*.json
*.jsonl

# Python
__pycache__/
*.pyc

# エディタ
.vscode/
.idea/
EOF

# Git初期化
git init
git add exporter.py .gitignore
git commit -m "feat: Claude Code session exporter"

# GitHubにプッシュ（GitHub CLI使用）
gh repo create claude-chat-exporter --private --source=. --push</code></pre>
<p>GitHub連携の詳細は以下の記事を参照：</p>

<a rel="noopener" href="https://caymezon.com/github-cli-complete-guide/" title="GitHub CLI完全ガイド：コマンドラインでGitHub操作を効率化" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">GitHub CLI完全ガイド：コマンドラインでGitHub操作を効率化</div><div class="blogcard-snippet internal-blogcard-snippet">GitHub CLI（ghコマンド）は、GitHubの操作をコマンドラインで完結できる公式ツールです。ブラウザを開かずに、リポジトリ作成からIssue管理、Pull Request作成まで、すべてターミナルで行えます。この記事では、実際の導...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.31</div></div></div></div></a>
<hr>
<p><strong>ご意見・改善提案があれば、ぜひコメントでお知らせください！</strong></p><p>The post <a href="https://caymezon.com/claude-code-session-exporter/">Claude Codeセッションログを一括MD化！拡張版エクスポーターで開発記録を資産化</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/claude-code-session-exporter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Claudeチャットを資産化！エクスポートデータを整形するPythonツール</title>
		<link>https://caymezon.com/claude-chat-exporter-tool/</link>
					<comments>https://caymezon.com/claude-chat-exporter-tool/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sat, 31 Jan 2026 06:23:12 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ツール開発]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20035</guid>

					<description><![CDATA[<p>Claudeとの会話履歴は貴重な知的財産です。しかし、エクスポートしたJSONファイルは読みにくく、そのままでは活用しづらいのが現状です。この記事では、ClaudeのエクスポートデータをMarkdown形式に整形し、チャ [&#8230;]</p>
<p>The post <a href="https://caymezon.com/claude-chat-exporter-tool/">Claudeチャットを資産化！エクスポートデータを整形するPythonツール</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Claudeとの会話履歴は貴重な知的財産です。しかし、エクスポートしたJSONファイルは読みにくく、そのままでは活用しづらいのが現状です。この記事では、ClaudeのエクスポートデータをMarkdown形式に整形し、チャット毎に分割して保存するPythonツールを紹介します。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">なぜClaudeチャットを管理するのか？</a></li><li><a href="#toc2" tabindex="0">Claudeチャットのエクスポート方法</a><ol><li><a href="#toc3" tabindex="0">ステップ1: Claudeチャット画面を開く</a></li><li><a href="#toc4" tabindex="0">ステップ2: エクスポートメニューを表示</a></li><li><a href="#toc5" tabindex="0">ステップ3: JSON形式でダウンロード</a></li><li><a href="#toc6" tabindex="0">エクスポートデータの構造</a></li></ol></li><li><a href="#toc7" tabindex="0">Pythonツールの概要</a><ol><li><a href="#toc8" tabindex="0">機能</a></li><li><a href="#toc9" tabindex="0">プロジェクト構成</a></li></ol></li><li><a href="#toc10" tabindex="0">ソースコード</a><ol><li><a href="#toc11" tabindex="0">exporter.py</a></li><li><a href="#toc12" tabindex="0">.gitignore</a></li><li><a href="#toc13" tabindex="0">README.md</a></li></ol></li><li><a href="#toc14" tabindex="0">出力例</a><ol><li><a href="#toc15" tabindex="0">2. Pythonスクリプトを実行</a></li><li><a href="#toc16" tabindex="0">3. JSONファイルを選択</a></li><li><a href="#toc17" tabindex="0">4. 出力確認</a></li><li><a href="#toc18" tabindex="0">出力例</a></li></ol></li><li><a href="#toc19" tabindex="0">コードの解説</a><ol><li><a href="#toc20" tabindex="0">ファイル選択ダイアログ</a></li><li><a href="#toc21" tabindex="0">エンコーディング自動判定</a></li><li><a href="#toc22" tabindex="0">タイムスタンプ付きフォルダ作成</a></li><li><a href="#toc23" tabindex="0">ファイル名の安全化</a></li><li><a href="#toc24" tabindex="0">Markdown形式で出力</a></li></ol></li><li><a href="#toc25" tabindex="0">VSCodeでのデバッグ実行</a><ol><li><a href="#toc26" tabindex="0">初回実行時の設定</a></li><li><a href="#toc27" tabindex="0">デバッグの活用</a></li></ol></li><li><a href="#toc28" tabindex="0">GitHub連携</a><ol><li><a href="#toc29" tabindex="0">クイックスタート</a></li></ol></li><li><a href="#toc30" tabindex="0">応用例</a><ol><li><a href="#toc31" tabindex="0">1. バッチ処理</a></li><li><a href="#toc32" tabindex="0">2. カテゴリ分類</a></li><li><a href="#toc33" tabindex="0">3. 日付フィルタリング</a></li></ol></li><li><a href="#toc34" tabindex="0">トラブルシューティング</a><ol><li><a href="#toc35" tabindex="0">エラー1: ModuleNotFoundError: No module named 'tkinter'</a></li><li><a href="#toc36" tabindex="0">エラー2: UnicodeDecodeError</a></li><li><a href="#toc37" tabindex="0">エラー3: 出力フォルダが作成されない</a></li></ol></li><li><a href="#toc38" tabindex="0">まとめ</a></li><li><a href="#toc39" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">なぜClaudeチャットを管理するのか？</span></h2>
<p>Claudeとの会話には、以下のような価値があります：</p>
<ul>
<li><strong>問題解決の過程</strong>: エラー解決やトラブルシューティングの記録</li>
<li><strong>学習内容</strong>: 新しい技術や概念の理解プロセス</li>
<li><strong>アイデアの発展</strong>: プロジェクトの企画や設計の議論</li>
<li><strong>コードレビュー</strong>: 実装の改善提案や最適化の議論</li>
</ul>
<p>これらを適切に管理することで：</p>
<ul>
<li>後から見返して復習できる</li>
<li>同じ問題に再度直面したときに参照できる</li>
<li>チーム内で知識を共有できる</li>
<li>ブログ記事や技術文書の素材になる</li>
</ul>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"実践Claude Code入門―現場で活用するためのAIコーディングの思考法","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51kkd9SNiVL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297153548","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4297153548","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E5%AE%9F%E8%B7%B5Claude%20Code%E5%85%A5%E9%96%80%E2%80%95%E7%8F%BE%E5%A0%B4%E3%81%A7%E6%B4%BB%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E6%80%9D%E8%80%83%E6%B3%95","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"lxeQQ","s":"s"});</script></p>
<div id="msmaflink-lxeQQ">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">Claudeチャットのエクスポート方法</span></h2>
<h3><span id="toc3">ステップ1: Claudeチャット画面を開く</span></h3>
<p><a href="https://claude.ai">https://claude.ai</a> にアクセスし、エクスポートしたい会話を開きます。</p>
<h3><span id="toc4">ステップ2: エクスポートメニューを表示</span></h3>
<p>画面右上の「︙」（3点リーダー）をクリックし、「Export chat」を選択します。</p>
<h3><span id="toc5">ステップ3: JSON形式でダウンロード</span></h3>
<p>「Download as JSON」を選択すると、JSONファイルがダウンロードされます。</p>
<p>ファイル名例: <code>claude_conversations_2026-01-31.json</code></p>
<h3><span id="toc6">エクスポートデータの構造</span></h3>
<p>エクスポートしたJSONファイルは以下のような構造になっています：</p>
<pre><code class="language-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"
      }
    ]
  }
]</code></pre>
<p>このままでは読みにくいため、整形ツールが必要です。</p>
<h2><span id="toc7">Pythonツールの概要</span></h2>
<h3><span id="toc8">機能</span></h3>
<ol>
<li><strong>ファイル選択ダイアログ</strong>: GUIでJSONファイルを選択</li>
<li><strong>エンコーディング自動判定</strong>: UTF-8/Shift-JIS両対応</li>
<li><strong>タイムスタンプ付きフォルダ作成</strong>: <code>output/yyyymmdd_hhmmss/</code>形式</li>
<li><strong>チャット毎に分割</strong>: 各チャットを個別のMarkdownファイルに出力</li>
<li><strong>ファイル名の安全化</strong>: 使えない文字を自動置換</li>
</ol>
<h3><span id="toc9">プロジェクト構成</span></h3>
<pre><code class="language-plaintext">C:\my-local\my-python\
├── claude_chat_exporter/
│   ├── exporter.py           # メインスクリプト
│   ├── README.md             # 使い方説明
│   └── output/               # 出力先（自動生成）
│       └── 20260131_120000/  # タイムスタンプフォルダ
│           ├── チャット1.md
│           ├── チャット2.md
│           └── ...
├── .gitignore
├── README.md
└── requirements.txt</code></pre>
<h2><span id="toc10">ソースコード</span></h2>
<h3><span id="toc11">exporter.py</span></h3>
<pre><code class="language-python">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}")</code></pre>
<h3><span id="toc12">.gitignore</span></h3>
<pre><code class="language-plaintext"># Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
.venv/

# 出力ファイル
*/output/
*.json

# IDE
.vscode/
.idea/

# OS
.DS_Store
Thumbs.db</code></pre>
<h3><span id="toc13">README.md</span></h3>
<pre><code class="language-markdown"># Claude Chat Exporter

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

## 使い方

```bash
python exporter.py</code></pre>
<ol>
<li>ファイル選択ダイアログでJSONファイルを選択</li>
<li><code>output/yyyymmdd_hhmmss/</code>にチャット毎のmdファイルが出力される</li>
</ol>
<h2><span id="toc14">出力例</span></h2>
<pre><code class="language-plaintext">output/
└── 20260131_120000/
    ├── GitHubリポジトリ作成手順.md
    ├── Python開発環境構築.md
    └── VSCodeデバッグ使い方.md</code></pre>
<pre><code class="language-plaintext">
## 使い方

### 1. プロジェクトフォルダ作成

```bash
# フォルダ作成
mkdir C:\my-local\my-python\claude_chat_exporter
cd C:\my-local\my-python\claude_chat_exporter

# Pythonスクリプト作成
# 上記のexporter.pyの内容をコピー</code></pre>
<p>VSCodeで <code>exporter.py</code> を作成し、上記のコードを貼り付けます。</p>
<h3><span id="toc15">2. Pythonスクリプトを実行</span></h3>
<h4>VSCodeから実行</h4>
<ol>
<li><code>exporter.py</code> を開く</li>
<li>右上の「▶」ボタンをクリック（または <code>F5</code> でデバッグ実行）</li>
<li>ファイル選択ダイアログが表示される</li>
</ol>
<h4>コマンドラインから実行</h4>
<pre><code class="language-bash">cd C:\my-local\my-python\claude_chat_exporter
python exporter.py</code></pre>
<h3><span id="toc16">3. JSONファイルを選択</span></h3>
<p>ファイル選択ダイアログで、ClaudeからエクスポートしたJSONファイルを選択します。</p>
<h3><span id="toc17">4. 出力確認</span></h3>
<pre><code class="language-bash"># 出力フォルダを確認
dir output\20260131_120000</code></pre>
<p>各チャットが個別のMarkdownファイルとして出力されます。</p>
<h3><span id="toc18">出力例</span></h3>
<p><strong>出力ファイル: GitHubリポジトリ作成手順.md</strong></p>
<pre><code class="language-markdown"># GitHubリポジトリ作成手順

**[human]**: 

GitHubにリポジトリを作成する方法を教えて

**[assistant]**: 

GitHubにリポジトリを作成する方法は2つあります...

**[human]**: 

GitHub CLIを使った方法を詳しく教えて

**[assistant]**: 

GitHub CLIを使うと、コマンドラインで簡単にリポジトリを作成できます...</code></pre>
<h2><span id="toc19">コードの解説</span></h2>
<h3><span id="toc20">ファイル選択ダイアログ</span></h3>
<pre><code class="language-python">p = fd.askopenfilename(filetypes=[("JSON files", "*.json")])
if not p:
    exit()</code></pre>
<ul>
<li><code>tkinter.filedialog</code>を使用してGUIでファイル選択</li>
<li><code>.json</code>ファイルのみフィルタ</li>
<li>キャンセル時は終了</li>
</ul>
<h3><span id="toc21">エンコーディング自動判定</span></h3>
<pre><code class="language-python">try:
    d = json.load(open(p, 'r', encoding='utf-8'))
except:
    d = json.load(open(p, 'r', encoding='cp932'))</code></pre>
<ul>
<li>まずUTF-8で読み込みを試行</li>
<li>失敗したらShift-JIS（cp932）で再試行</li>
<li>日本語環境での互換性確保</li>
</ul>
<h3><span id="toc22">タイムスタンプ付きフォルダ作成</span></h3>
<pre><code class="language-python">output_dir = Path(__file__).parent / 'output' / datetime.now().strftime('%Y%m%d_%H%M%S')
output_dir.mkdir(parents=True, exist_ok=True)</code></pre>
<ul>
<li><code>Path(__file__).parent</code>: スクリプトと同じ場所</li>
<li><code>datetime.now().strftime('%Y%m%d_%H%M%S')</code>: <code>20260131_120000</code>形式</li>
<li><code>parents=True</code>: 親フォルダも自動作成</li>
<li><code>exist_ok=True</code>: 既存フォルダでもエラーにしない</li>
</ul>
<h3><span id="toc23">ファイル名の安全化</span></h3>
<pre><code class="language-python">filename = re.sub(r'[\\/:*?"<>|]', '_', title) + '.md'</code></pre>
<ul>
<li>Windowsで使えない文字（<code>\ / : * ? " < > |</code>）を<code>_</code>に置換</li>
<li><code>.md</code>拡張子を追加</li>
</ul>
<h3><span id="toc24">Markdown形式で出力</span></h3>
<pre><code class="language-python">f.write(f"# {title}\n\n")
for m in c.get('chat_messages', []):
    f.write(f"**[{m['sender']}]**:\n\n{m['text']}\n\n")</code></pre>
<ul>
<li>タイトルは <code># タイトル</code> 形式（見出し1）</li>
<li>送信者は <code>**[sender]**:</code> 形式（太字）</li>
<li>メッセージ間は空行で区切る</li>
</ul>
<h2><span id="toc25">VSCodeでのデバッグ実行</span></h2>
<h3><span id="toc26">初回実行時の設定</span></h3>
<ol>
<li><code>F5</code> キーを押す</li>
<li>「Python Debugger」を選択</li>
<li>「Pythonファイル 現在アクティブなPythonファイルをデバッグする」を選択</li>
</ol>
<h3><span id="toc27">デバッグの活用</span></h3>
<p>ブレークポイントを設定して動作を確認：</p>
<pre><code class="language-python"># ①ファイルが読めたか確認
d = json.load(...)  # ←ここに●

# ②チャット数とタイトル確認
for i, c in enumerate(d):  # ←ここに●
    title = c.get('name', f'chat_{i}')
    
    # ③ファイル名が正しいか確認
    filename = re.sub(...)  # ←ここに●</code></pre>
<p>ブレークポイント設定方法：</p>
<ul>
<li>行番号の左側をクリック → 赤丸が表示</li>
<li><code>F10</code>: 次の行へ（ステップオーバー）</li>
<li><code>F11</code>: 関数の中に入る（ステップイン）</li>
<li><code>F5</code>: 続行</li>
</ul>
<h2><span id="toc28">GitHub連携</span></h2>
<p>このツールをGitHubで管理する方法は、以下の記事で詳しく解説しています：</p>
<ul>
<li>GitHubリポジトリ作成の2つの方法：GUI vs CLI徹底比較</li>
</ul>

<a rel="noopener" href="https://caymezon.com/github-repository-creation-gui-vs-cli/" title="GitHubリポジトリ作成の2つの方法：GUI vs CLI徹底比較" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">GitHubリポジトリ作成の2つの方法：GUI vs CLI徹底比較</div><div class="blogcard-snippet internal-blogcard-snippet">GitHubでリポジトリを作成する方法は大きく分けて2つあります。ブラウザを使ったGUI操作と、GitHub CLIを使ったコマンドライン操作です。この記事では、実際のPythonプロジェクトを例に、両方の方法を詳しく解説します。前提条件G...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.31</div></div></div></div></a>
<ul>
<li>GitHub CLI完全ガイド：コマンドラインでGitHub操作を効率化</li>
</ul>

<a rel="noopener" href="https://caymezon.com/github-cli-complete-guide/" title="GitHub CLI完全ガイド：コマンドラインでGitHub操作を効率化" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">GitHub CLI完全ガイド：コマンドラインでGitHub操作を効率化</div><div class="blogcard-snippet internal-blogcard-snippet">GitHub CLI（ghコマンド）は、GitHubの操作をコマンドラインで完結できる公式ツールです。ブラウザを開かずに、リポジトリ作成からIssue管理、Pull Request作成まで、すべてターミナルで行えます。この記事では、実際の導...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.31</div></div></div></div></a>
<h3><span id="toc29">クイックスタート</span></h3>
<pre><code class="language-bash">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</code></pre>
<h2><span id="toc30">応用例</span></h2>
<h3><span id="toc31">1. バッチ処理</span></h3>
<p>複数のJSONファイルを一度に処理：</p>
<pre><code class="language-python">import glob

# すべてのJSONファイルを取得
json_files = glob.glob("exports/*.json")

for json_file in json_files:
    # 処理ロジック
    ...</code></pre>
<h3><span id="toc32">2. カテゴリ分類</span></h3>
<p>チャットタイトルに基づいて自動分類：</p>
<pre><code class="language-python"># タイトルにキーワードが含まれていたらフォルダ分け
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)</code></pre>
<h3><span id="toc33">3. 日付フィルタリング</span></h3>
<p>特定期間のチャットのみ抽出：</p>
<pre><code class="language-python">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:
        # 処理
        ...</code></pre>
<h2><span id="toc34">トラブルシューティング</span></h2>
<h3><span id="toc35">エラー1: ModuleNotFoundError: No module named 'tkinter'</span></h3>
<p><strong>原因</strong>: Pythonインストール時にtkinterが含まれていない</p>
<p><strong>解決方法</strong>:</p>
<ul>
<li>Windows: Python再インストール時に「tcl/tk and IDLE」にチェック</li>
<li>macOS: <code>brew install python-tk</code></li>
<li>Linux: <code>sudo apt install python3-tk</code></li>
</ul>
<h3><span id="toc36">エラー2: UnicodeDecodeError</span></h3>
<p><strong>原因</strong>: JSONファイルのエンコーディングが想定外</p>
<p><strong>解決方法</strong>: コードが自動判定するため通常は発生しません。発生した場合は以下を試してください：</p>
<pre><code class="language-python"># エンコーディングを明示的に指定
d = json.load(open(p, 'r', encoding='utf-8-sig'))  # BOM付きUTF-8</code></pre>
<h3><span id="toc37">エラー3: 出力フォルダが作成されない</span></h3>
<p><strong>原因</strong>: 権限不足</p>
<p><strong>解決方法</strong>:</p>
<ul>
<li>管理者権限でVSCodeを実行</li>
<li>または、書き込み可能なフォルダに移動</li>
</ul>
<h2><span id="toc38">まとめ</span></h2>
<p>このツールを使うことで：</p>
<ul>
<li>✅ Claudeチャットを読みやすいMarkdown形式で保存</li>
<li>✅ チャット毎に分割して管理しやすく</li>
<li>✅ タイムスタンプ付きで履歴管理</li>
<li>✅ GitHubで バージョン管理</li>
</ul>
<p>Claudeとの会話は貴重な知的財産です。このツールを使って、効率的に管理・活用してください。</p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"GitHub Copilot×Python入門","b":"日経BP","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51KyCqK80-L._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4296070975","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4296070975","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/GitHub%20Copilot%C3%97Python%E5%85%A5%E9%96%80\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=GitHub%20Copilot%C3%97Python%E5%85%A5%E9%96%80","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"WRNKr","s":"s"});</script></p>
<div id="msmaflink-WRNKr">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc39">関連記事</span></h2>
<ul>
<li>GitHubリポジトリ作成の2つの方法：GUI vs CLI徹底比較</li>
</ul>

<a rel="noopener" href="https://caymezon.com/github-repository-creation-gui-vs-cli/" title="GitHubリポジトリ作成の2つの方法：GUI vs CLI徹底比較" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/github-repository-creation-gui-vs-cli-featured-520c02-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">GitHubリポジトリ作成の2つの方法：GUI vs CLI徹底比較</div><div class="blogcard-snippet internal-blogcard-snippet">GitHubでリポジトリを作成する方法は大きく分けて2つあります。ブラウザを使ったGUI操作と、GitHub CLIを使ったコマンドライン操作です。この記事では、実際のPythonプロジェクトを例に、両方の方法を詳しく解説します。前提条件G...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.31</div></div></div></div></a>
<ul>
<li>GitHub CLI完全ガイド：コマンドラインでGitHub操作を効率化</li>
</ul>

<a rel="noopener" href="https://caymezon.com/github-cli-complete-guide/" title="GitHub CLI完全ガイド：コマンドラインでGitHub操作を効率化" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/github-cli-complete-guide-featured-b23a6b-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">GitHub CLI完全ガイド：コマンドラインでGitHub操作を効率化</div><div class="blogcard-snippet internal-blogcard-snippet">GitHub CLI（ghコマンド）は、GitHubの操作をコマンドラインで完結できる公式ツールです。ブラウザを開かずに、リポジトリ作成からIssue管理、Pull Request作成まで、すべてターミナルで行えます。この記事では、実際の導...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.31</div></div></div></div></a>
<p><!-- ## 今後の拡張予定

- 全文検索機能
- Web UI版の開発
- 自動タグ付け機能
- Notion/Obsidianへのエクスポート

ご意見・ご要望があれば、GitHubのIssueでお知らせください！ --></p><p>The post <a href="https://caymezon.com/claude-chat-exporter-tool/">Claudeチャットを資産化！エクスポートデータを整形するPythonツール</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/claude-chat-exporter-tool/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
