Pythonでファイルのmimetypeを取得する一番簡単な方法【ライブラリなし】

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モジュールの利用コード例

▼ 上記コードの出力結果

このように 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 が返ってきました。

▼ このコードで実際に検証済み

▼ 出力結果

この点は少し残念ではあります。

とはいえ「中身をバイナリ的に解析してMIMEタイプ判定」とかやってもメリットは少ないと思います。もしそれほどの厳密が必要ならライブラリを探してください(多分見つからないと思う)

普通の用途ならこれで十分すぎる。

Python3ならこのモジュールを使えば楽だと思う

ファイルパスからMIMEタイプを判別したい……

そのためだけに独自コードを書くのは面倒すぎます。

Python3以降ならmimetypesを使っていきたいです。

以上、PythonでのMIMEタイプ判定について。ではまた