PythonにおけるMIMEType
- ファイルからMIMETypeを調べたい
- ライブラリとかも使いたくない
そこで見つけたのが次のモジュール
mimetypes
本当に名前のまんまです。
MIMEタイプを本当に簡単に取得できました。
ただし残念ながらPython3以降のみ。
でも便利だったのでMIMEType取得方法を紹介
このページの目次
MIMEType(MIMEタイプ)とはファイル種類を表すもの
ファイル拡張子とは違います。
拡張子はファイル名の末尾につくものであり、
あれはMIMEtyap推測のヒントの1つになっています。
ではMIMEtypeは何なのかという話ですが…
▼ 詳細はググればいくらでも出てくる
MIMEタイプとは、電子メールに文字以外のデータを含める方式を定めたMIMEで、データ形式を識別するためのコードの体系。転じて、Webのデータ送受信を行うHTTPなどでもデータの種類を表すコード(Content-Type)として利用されている。
「タイプ名/サブタイプ名」の形式で記述され、タイプ名でデータの種類(テキスト、画像、動画など)を、サブタイプ名で具体的なデータ形式を指定する。例えば、プレーンテキストは「text/plain」、HTML文書は「text/html」、JPEG画像は「image/jpeg」などと定められている。
引用元 : https://e-words.jp/w/MIME%E3%82%BF%E3%82%A4%E3%83%97.html
「タイプ名/サブタイプ名」の形式
例えば有名な形式として以下があります。
- PNG画像 : image/png
- MP4動画 : video/mp4
- CSV形式 : text/csv
- Zip形式 : application/zip
- MS Word : application/msword
代表的なのはこういうもの
特定のソフトに依存する形式(Admobe PDF, MS Word, PowerPoint, etc)の場合、タイプ名が application 、サブタイプ名が zip , msword などに分類されることが多いです。
まあ今更こんな解説いらないですよね。
でも念のために説明しておきます。
Python3ならmimetypesモジュールが使えるから便利
そしてPython3ではMIMEtype判別がラクです。
どれくらい楽かという次のコードを見てください。
▼ mimetypesモジュールの利用コード例
1 2 3 4 5 6 7 |
## モジュールインポート import mimetypes file_name = "C:/path/to/video.mp4" mimetype,encoding = mimetypes.guess_type(file_name) print("MIME type : %s" % mimetype) print("Encoding : %s" % encoding) |
▼ 上記コードの出力結果
1 2 |
MIME type : video/mp4 Encoding : None |
このように mimetypes.guess_type を使うだけ
ファイルパスを渡すことで (MIMEタイプ , 符号化形式) のタプルを返してくれます、符号化形式がない場合は None になるみたいなので、特に気にしなくていいです
そして肝心のMIME typeもしっかり取得できてます。
いくつか別ファイルで試しても正常に取得できました。
ただしmimetypes.guess_typeは精度100%ではない
ただし1つだけ注意点があります。
このmimetypes,guess_typeは推測するだけ
100%の精度までは保証していません。
▼ 公式リファレンスでもこう説明されている
url で与えられるファイル名あるいは URL に基づいて、ファイルの型を推定します。URL は文字列または path-like object です。
引用元 : https://docs.python.org/ja/3/library/mimetypes.html?highlight=mimetypes#module-mimetypes
別にファイルの中身を解析して
- このファイルはヘッダーがxxxだから、
- バイナリ的に特定のパターンがあるから、
みたいに厳密に判定してる訳じゃないってこと
飽くまでファイル名またURL的に判断してるだけです。
でも自力で判定するよりはよっぽど楽ですよね?
ファイル・拡張子が偽装されてるケースは無効です。
でもそんなレアケースは無視しても問題ないはず。
ちなみに拡張子偽装ファイルでは偽のMIMEtypeが返される
例えば次の偽装ファイルがあるとします。
- 本当の中身は video/mp4 のファイル
- でも拡張子は .png で偽装している
その場合、偽のMIME type が返ってきました。
▼ このコードで実際に検証済み
1 2 3 4 5 6 7 8 9 |
## モジュールインポート import mimetypes ## ファイルパス(正体はmp4動画) file_name = "C:/path/to/fake.png" ## MIMEタイプ判定 mimetype, = mimetypes.guess_type(file_name) print("MIME type : %s" % mimetype) |
▼ 出力結果
1 |
MIME type : image/png |
この点は少し残念ではあります。
とはいえ「中身をバイナリ的に解析してMIMEタイプ判定」とかやってもメリットは少ないと思います。もしそれほどの厳密が必要ならライブラリを探してください(多分見つからないと思う)
普通の用途ならこれで十分すぎる。
Python3ならこのモジュールを使えば楽だと思う
ファイルパスからMIMEタイプを判別したい……
そのためだけに独自コードを書くのは面倒すぎます。
Python3以降ならmimetypesを使っていきたいです。
以上、PythonでのMIMEタイプ判定について。ではまた