WhatsAppログ分割ツールに複数ファイル対応を追加した

はじめに

前回までの記事でWhatsAppログ分割ツールを作成しました。

今回は、複数のログファイルを一度に処理できる機能を追加する開発過程を共有します。

macOSでの複数ファイルドラッグ&ドロップ処理には特殊な仕組みが必要でした1。実際の開発で直面した課題と解決方法を詳しく説明します。

複数ファイル処理が必要になった背景

WhatsAppからエクスポートしたチャットログは、通常1つずつファイルになります。複数の人とのチャットログを一度に処理したい場面が多くあります。

元のツールでは、ファイルを1つずつ選択して処理する必要がありました。10個のチャットログがあれば、10回操作を繰り返さなければなりません。これは非効率的です。

ドラッグ&ドロップで複数ファイルを一度に処理できれば、作業効率が大幅に向上します。

macOSでの複数ファイルドラッグ&ドロップの仕組み

macOSでは、複数ファイルをドラッグ&ドロップすると、特殊な形式でデータが送られてきます。

{/path/to/file1.txt} {/path/to/file2.txt} {/path/to/file3.txt}

各ファイルパスが波括弧({})で囲まれ、空白で区切られています2。この形式を正しく解析する必要があります。

WindowsやLinuxとは異なる仕様のため、macOS専用の処理が必要になります。

既存のEMLコンバーターから学んだ実装方法

別プロジェクトのEMLコンバーターで、すでに同様の機能が実装されていました。そのコードを参考にして、効率的に開発を進めることができました。

重要なのは parse_macos_file_paths メソッドです。正規表現を使って波括弧で囲まれた部分を抽出します3

def parse_macos_file_paths(self, file_data):
    """macOSの{path1} {path2}形式からファイルパスを抽出する"""
    import re
    
    # {}で囲まれた部分を全て抽出
    pattern = r'\{([^}]+)\}'
    matches = re.findall(pattern, file_data)
    
    return matches
Code language: PHP (php)

この処理により、複数ファイルのパスを確実に取得できます。

ファイル検証機能の追加

ドラッグ&ドロップされたファイルが、処理可能な形式かどうかを確認する必要があります。

WhatsAppログ分割ツールでは、テキストファイル(.txt)とZIPファイル(.zip)のみを処理対象とします。他の形式のファイルが混入していても、エラーにならないよう適切にフィルタリングします。

for file_path in file_paths:
    if file_path and os.path.exists(file_path):
        if (file_path.lower().endswith('.txt') or 
            file_path.lower().endswith('.zip')):
            valid_files.append(file_path)
Code language: JavaScript (javascript)

この検証により、処理可能なファイルのみが次の段階に進みます。

複数ファイル処理の設計思想

複数ファイルを処理する際の設計では、以下の方針を採用しました。

  • 同一フォルダへの出力 各ファイルを個別のフォルダに分けず、すべて同じフォルダに出力します。ファイル名に元のチャット名が含まれているため、区別は十分可能です。
  • 統一されたフォルダ命名規則 出力フォルダ名を YYYY-MM-DD_data 形式に統一しました。処理日が明確になり、管理しやすくなります。
  • エラー耐性の向上 1つのファイルでエラーが発生しても、他のファイルの処理は継続します。全体の処理が止まることを防ぎます。

進捗表示とログ機能の強化

複数ファイル処理では、進捗状況が分からないとユーザーが不安になります。詳細なログ表示機能を追加しました。

  • 処理状況の可視化 どのファイルを処理中なのか、何個中何個目なのかを明確に表示します。
  • デバッグ情報の追加 ドラッグ&ドロップで受信したデータの内容を表示します。問題が発生した際の原因特定に役立ちます。
  • 結果の集計表示 処理完了後、成功したファイル数とエラーが発生したファイル数を表示します。
=== 処理結果 ===
成功: 8個
エラー: 0個
合計: 8個

この情報により、処理結果を一目で把握できます。

非同期処理による応答性の維持

複数ファイルの処理には時間がかかる場合があります。メインスレッドで処理を行うと、UIが固まってしまいます4

別スレッドで処理を実行することで、UIの応答性を維持しました。ユーザーは処理中もログを確認でき、必要に応じて操作を中断できます。

thread = threading.Thread(target=self.process_files_thread, args=(file_paths,))
thread.daemon = True
thread.start()
Code language: PHP (php)

この実装により、快適な操作感を実現しています5

実装時に発生した課題と解決策

  • パス文字列の処理 macOSから受信するファイルパスには、前後に余分な空白が含まれる場合があります。strip() メソッドで確実に除去する処理を追加しました6
  • ファイル存在確認の重要性 ドラッグ&ドロップ時に、存在しないファイルパスが送られてくる場合があります。処理前の存在確認が必須です。
  • 文字エンコーディングの考慮 複数ファイルを処理する際も、各ファイルの文字エンコーディングを適切に判定する必要があります。既存のエンコーディング判定機能をそのまま活用しました。

出力フォルダ構造の最適化

当初は、複数ファイル処理時に各ファイル用の個別フォルダを作成する設計でした。しかし、以下の理由で同一フォルダに統合する方式に変更しました。

  • 管理の簡素化 フォルダが分散すると、後でファイルを探すのが困難になります。
  • ファイル名による識別 出力されるファイル名には、元のチャット名が含まれています。フォルダを分ける必要性が低いと判断しました。
  • 一貫性の確保 単一ファイル処理時と複数ファイル処理時で、同じフォルダ構造を使用します。ユーザーの混乱を防げます。

今回の改良で得られた効果

  • 作業効率の大幅向上 10個のファイルを処理する場合、従来は10回の操作が必要でした。現在は1回のドラッグ&ドロップで完了します。
  • 操作ミスの削減 繰り返し作業が不要になり、ファイルの選択ミスや処理し忘れを防げます。
  • 処理状況の透明性 詳細なログにより、何が行われているかが明確になりました。問題発生時の原因特定も容易です。

まとめ

WhatsAppログ分割ツールに複数ファイル対応機能を追加しました。macOS特有のドラッグ&ドロップ形式に対応し、効率的な一括処理を実現しています。

既存のコードを参考にした開発手法により、短期間で安定した機能を実装できました7。ユーザビリティを重視した設計により、直感的で使いやすいツールに進化しています。

技術的なポイント

  • 正規表現による macOS ファイルパス解析
  • 非同期処理による UI 応答性確保
  • エラー耐性を持つ複数ファイル処理フロー
  • 統一された出力フォルダ構造

  1. macOSでは複数ファイルのドラッグ&ドロップ時に、各ファイルパスが波括弧で囲まれた独特の形式でデータが送られてきます。これはWindowsやLinuxとは異なるプラットフォーム固有の仕様です。 – 【Python】tkinter:ファイルのドラッグアンドドロップ(パス取得、画像表示) | OFFICE54
  2. この形式はmacOSのTkinterDnD特有の仕様です。正規表現による解析が必要になります。 – tkinter でドラッグアンドドロップ! #Python – Qiita
  3. 正規表現パターン r'\{([^}]+)\}' は、波括弧で囲まれた内容をキャプチャグループとして抽出します。[^}]+ は「}以外の文字を1文字以上」という意味です。 – re — 正規表現操作 — Python 3.13.3 ドキュメント
  4. GUIアプリケーションでは、メインスレッドがUI更新を担当するため、重い処理を同じスレッドで行うとユーザーインターフェースが応答しなくなります。 – threading — スレッドベースの並列処理 — Python 3.13.3 ドキュメント
  5. daemon = True の設定により、メインプログラムが終了する際にバックグラウンドスレッドも自動的に終了します。これにより、プログラムの正常終了が保証されます。 – 【Python】threadingで効率的な並行処理(マルチスレッド)を実現する!
  6. 文字列の前後の空白や改行文字を削除するPython標準の文字列メソッドです。ドラッグ&ドロップ時のデータには予期しない空白が含まれることがあるため、必須の処理です。 – Pythonの正規表現モジュールreの使い方(match, search, subなど) | note.nkmk.me
  7. この開発では、別プロジェクトのEMLコンバーターで実装済みの複数ファイル処理ロジックを参考にしました。既存コードの再利用により、開発効率と品質の両方を向上させることができます。 – CSV viewerアプリの作り方(ドラッグアンドドロップ)【Python】