技術ドキュメント: check_office_file_type.py
プログラムの動作
check_office_file_type.py は、指定されたファイルがMicrosoft Office Open XML形式(Word, Excel, PowerPoint)のいずれであるかを判別するためのPythonスクリプトです。このプログラムは、ファイルの拡張子に依存せず、その内容に基づいてファイルタイプを識別します。
主な機能は以下の2つの方法でファイルタイプを判別し、その結果を標準出力に表示することです。
MIMEタイプによる判別: ファイルのMIMEタイプを解析し、Office Open XML形式のMIMEタイプと照合します。
ZIPコンテンツによる判別: Office Open XMLファイルが実質的にZIPアーカイブであるという特性を利用し、アーカイブ内部の特定のXMLファイルの存在を確認して判別します。
このプログラムは、ファイルの拡張子が正しくない場合や、より信頼性の高い方法でOfficeファイルを識別する必要がある場合に役立ちます。
原理
本プログラムは、Office Open XMLファイルが持つ二つの特徴を利用してファイルタイプを判別します。
MIMEタイプ解析: Microsoft Office Open XML形式のファイルは、それぞれ特定のMIMEタイプを持ちます。
Word文書 (
.docx):application/vnd.openxmlformats-officedocument.wordprocessingml.documentExcelワークシート (
.xlsx):application/vnd.openxmlformats-officedocument.spreadsheetml.sheetPowerPointプレゼンテーション (
.pptx):application/vnd.openxmlformats-officedocument.presentationml.presentationプログラムはpython-magicライブラリを使用して、指定されたファイルのMIMEタイプを低レベルで解析し、これらの既知のMIMEタイプと一致するかどうかを確認します。
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圧縮したもの)
Word文書ファイルを指定した場合:
python check_office_file_type.py test.docx
出力例:
judge by magic : Word judge by zip content: Word
Excelワークシートファイルを指定した場合:
python check_office_file_type.py test.xlsx
出力例:
judge by magic : Excel judge by zip content: Excel
PowerPointプレゼンテーションファイルを指定した場合:
python check_office_file_type.py test.pptx
出力例:
judge by magic : PowerPoint judge by zip content: PowerPoint
通常のテキストファイルを指定した場合:
python check_office_file_type.py test.txt
出力例:
judge by magic : Unknown (text/plain) judge by zip content: Not a ZIP-based Office file
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)」と判断されます。引数を指定せずに実行した場合:
python check_office_file_type.py出力: (何も出力されません)
解説: コマンドライン引数が提供されないため、
infile変数が空文字列のままとなり、magic.from_file('')およびzipfile.ZipFile('', 'r')が例外を発生させます。これらの例外はtry...exceptブロックで捕捉され、握りつぶされるため、結果として何も表示されません。存在しないファイルを指定した場合:
python check_office_file_type.py non_existent_file.docx
出力: (何も出力されません)
解説: 存在しないファイルを指定した場合も、上記6番のケースと同様に、
magic.from_file()とzipfile.ZipFile()が例外を発生させ、それがtry...exceptブロックで捕捉されるため、何も表示されません。