技術ドキュメント: check_office_file_type.py

プログラムの動作

check_office_file_type.py は、指定されたファイルがMicrosoft Office Open XML形式(Word, Excel, PowerPoint)のいずれであるかを判別するためのPythonスクリプトです。このプログラムは、ファイルの拡張子に依存せず、その内容に基づいてファイルタイプを識別します。

主な機能は以下の2つの方法でファイルタイプを判別し、その結果を標準出力に表示することです。

  1. MIMEタイプによる判別: ファイルのMIMEタイプを解析し、Office Open XML形式のMIMEタイプと照合します。

  2. ZIPコンテンツによる判別: Office Open XMLファイルが実質的にZIPアーカイブであるという特性を利用し、アーカイブ内部の特定のXMLファイルの存在を確認して判別します。

このプログラムは、ファイルの拡張子が正しくない場合や、より信頼性の高い方法でOfficeファイルを識別する必要がある場合に役立ちます。

原理

本プログラムは、Office Open XMLファイルが持つ二つの特徴を利用してファイルタイプを判別します。

  1. MIMEタイプ解析: Microsoft Office Open XML形式のファイルは、それぞれ特定のMIMEタイプを持ちます。

    • Word文書 (.docx): application/vnd.openxmlformats-officedocument.wordprocessingml.document

    • Excelワークシート (.xlsx): application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

    • PowerPointプレゼンテーション (.pptx): application/vnd.openxmlformats-officedocument.presentationml.presentation プログラムは python-magic ライブラリを使用して、指定されたファイルのMIMEタイプを低レベルで解析し、これらの既知のMIMEタイプと一致するかどうかを確認します。

  2. ZIPアーカイブ構造解析: Office Open XMLファイル(.docx, .xlsx, .pptxなど)は、実際にはZIP形式で圧縮されたXMLファイルの集合体です。これらのファイルは、それぞれ特徴的な内部構造を持っています。

    • Word文書: ZIPアーカイブ内に word/document.xml というパスのファイルが含まれます。

    • Excelワークシート: ZIPアーカイブ内に xl/workbook.xml というパスのファイルが含まれます。

    • PowerPointプレゼンテーション: ZIPアーカイブ内に ppt/presentation.xml というパスのファイルが含まれます。 プログラムは zipfile 標準ライブラリを利用してファイルをZIPアーカイブとして開き、アーカイブ内のファイルリスト (namelist) を取得します。そして、上記のような特定のXMLファイルが存在するかどうかを確認することで、ファイルタイプを識別します。この方法により、ファイルが有効なOffice Open XMLファイルであるかどうかの追加的な検証も可能です。

必要な非標準ライブラリとインストール方法

このプログラムは、ファイルのMIMEタイプを判別するために python-magic ライブラリを使用します。

インストールは pip コマンドで行います。

Windowsユーザーの場合、libmagic のバイナリ依存関係を解決するために python-magic-bin を先にインストールする必要がある場合があります。

pip install python-magic-bin
pip install python-magic

必要な入力ファイル

プログラムは、コマンドライン引数として単一のファイルパスを期待します。

  • ファイル形式: 任意のファイル。主にMicrosoft Office Open XML形式(.docx, .xlsx, .pptx)のファイルが対象ですが、他のファイルに対してもMIMEタイプとZIP構造のチェックを試みます。

  • データ構造: 特定のデータ構造は必要ありません。

注意: 引数が与えられない場合や、存在しないファイルを指定した場合は、プログラムは何も出力せずに終了します。

生成される出力ファイル

このプログラムは、いかなるファイルも生成しません。 判別結果はすべて標準出力(コンソール)に表示されます。

コマンドラインでの使用例 (Usage)

プログラムの基本的な使用方法は以下の通りです。

python check_office_file_type.py <filepath>
  • <filepath>: 判別したいファイルのパスを指定します。

コマンドラインでの具体的な使用例

以下に、いくつかのシナリオでの実行例と、その出力結果を示します。

事前に以下のダミーファイルが存在するものとします。

  • test.docx: 実際のWord文書ファイル

  • test.xlsx: 実際のExcelワークシートファイル

  • test.pptx: 実際のPowerPointプレゼンテーションファイル

  • test.txt: 単なるテキストファイル(例: echo "Hello" > test.txt

  • test.zip: Officeファイルではない通常のZIPアーカイブ(例: 任意のファイルをZIP圧縮したもの)

  1. Word文書ファイルを指定した場合:

    python check_office_file_type.py test.docx
    

    出力例:

    judge by magic      :  Word
    judge by zip content:  Word
    
  2. Excelワークシートファイルを指定した場合:

    python check_office_file_type.py test.xlsx
    

    出力例:

    judge by magic      :  Excel
    judge by zip content:  Excel
    
  3. PowerPointプレゼンテーションファイルを指定した場合:

    python check_office_file_type.py test.pptx
    

    出力例:

    judge by magic      :  PowerPoint
    judge by zip content:  PowerPoint
    
  4. 通常のテキストファイルを指定した場合:

    python check_office_file_type.py test.txt
    

    出力例:

    judge by magic      :  Unknown (text/plain)
    judge by zip content:  Not a ZIP-based Office file
    
  5. Officeファイルではない通常のZIPファイルを指定した場合:

    python check_office_file_type.py test.zip
    

    出力例:

    judge by magic      :  Unknown (application/zip)
    judge by zip content:  Unknown (OpenXML ZIP)
    

    解説: python-magic はファイルがZIP形式であることを認識しますが、Office Open XMLのMIMEタイプとは一致しません。zipfile はZIPファイルとして開けますが、Officeファイル特有のXMLファイルを見つけられないため、「Unknown (OpenXML ZIP)」と判断されます。

  6. 引数を指定せずに実行した場合:

    python check_office_file_type.py
    

    出力: (何も出力されません)

    解説: コマンドライン引数が提供されないため、infile 変数が空文字列のままとなり、magic.from_file('') および zipfile.ZipFile('', 'r') が例外を発生させます。これらの例外は try...except ブロックで捕捉され、握りつぶされるため、結果として何も表示されません。

  7. 存在しないファイルを指定した場合:

    python check_office_file_type.py non_existent_file.docx
    

    出力: (何も出力されません)

    解説: 存在しないファイルを指定した場合も、上記6番のケースと同様に、magic.from_file()zipfile.ZipFile() が例外を発生させ、それが try...except ブロックで捕捉されるため、何も表示されません。