「PythonでMIMEタイプを判別したい」
「Pythonでfileコマンドと同じようなことをしたい」
このような場合には、python-magicがオススメです。
この記事では、python-magicについて解説しています。
本記事の内容
- python-magicとは?
- python-magicのシステム要件
- python-magicのインストール
- python-magicの動作確認
それでは、上記に沿って解説していきます。
python-magicとは?
python-magicは、ファイルタイプを識別するPythonライブラリです。
Cで開発されたlibmagicのラッパーと言えます。
ファイルの種類を確認する際、拡張子を信用するのは危険です。
拡張子なんていくらでも偽装できます。
しかし、python-magicを使えば、Python上でもそのような偽装を見破ることが可能となります。
つまり、python-magicは本当のファイル種別を判別できるのです。
以上、python-magicについて説明しました。
次は、python-magicのシステム要件を確認します。
python-magicのシステム要件
現時点(2022年2月末)でのpython-magicの最新バージョンは、0.4.25となります。
この最新バージョンは、2022年2月2日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
サポート対象となるPythonのバージョンは、以下となっています。
- Python 2.7
- Python 3.5
- Python 3.6
- Python 3.7
- Python 3.8
- Python 3.9
幅広いバージョンに対応しています。
しかし、利用する側は常に以下のPython公式開発サイクルを意識しておきましょう。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
現時点(2022年2月末)であれば、Python 3.7以降の利用がベターと言えます。
なお、Python 3.10はpython-magicのサポート対象に記載されていません。
しかし、Python 3.10でも問題なく利用できます。
ここまで確認したシステム要件は、特に複雑でも難しくもありません。
ただ、libmagic(Cライブラリ)が必須であることは少し面倒です。
各OS毎にインストール方法が異なります。
下記では、各OS毎のインストール方法を説明します。
Debian/Ubuntu
まずは、libmagic1のインストール状況を確認してみましょう。
確認する方法は、2つあります。
1つは、fileコマンドの有無を確認する方法です。
次のようにfileコマンドが動けば、libmagic1はインストール済みとなります。
$ file -v file-5.38 magic file from /etc/magic:/usr/share/misc/magic
もう一つは、インストール済みパッケージを確認する方法です。
確認は、次のコマンドで可能です。
apt list --installed libmagic1
複数台で試した結果、次のような結果でした。
$ apt list --installed libmagic1 一覧表示... 完了 libmagic1/groovy,now 1:5.38-5 amd64 [インストール済み、自動]
高い確率で、libmagic1はインストール済みです。
未インストールの場合は、以下のコマンドでインストールできます。
sudo apt-get install libmagic1
Windows
Windowsの場合は、まとめてインストールすることになります。
利用するコマンドは、以下。
pip install python-magic-bin
上記コマンドでは、libmagicのバイナリもまとめてpython-magicをインストールします。
OSX
macOSの場合は、どちらかのコマンドを利用します。
brew install libmagic port install file
以上、python-magicのシステム要件を説明しました。
次は、python-magicをインストールします。
python-magicのインストール
検証は、次のバージョンのPythonで行います。
$ python -V Python 3.10.2
まずは、現状のインストール済みパッケージを確認しておきます。
$ pip list Package Version ---------- ------- pip 22.0.3 setuptools 60.9.3 wheel 0.36.2
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、python-magicのインストールです。
python-magicのインストールは、以下のコマンドとなります。
pip install python-magic
インストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。
$ pip list Package Version ------------ ------- pip 22.0.3 python-magic 0.4.25 setuptools 60.9.3 wheel 0.36.2
python-magicには、依存するパッケージがありません。
そのため、libmagicの要件さえ満たせば既存環境に容易に導入できます。
以上、python-magicのインストールを説明しました。
次は、python-magicの動作確認を行います。
python-magicの動作確認
python-magicの動作確認を行うために、次のような画像を用意します。
それぞれの拡張子の画像を用意するだけです。
ただし、一つだけ偽物を用意します。
上記では、dog_fake.jpgが偽物になります。
dog_fake.jpgは、dog.pngの拡張子を変更したモノです。
python-magicが、dog_fake.jpgをどのように判定するのかも検証します。
検証に用いるのは、次のコードです。
import magic print(magic.from_file("file/dog.png", mime=True)) print(magic.from_file("file/cat.jpeg", mime=True)) print(magic.from_file("file/cat2.jpg", mime=True)) print(magic.from_file("file/bird.gif", mime=True)) print(magic.from_file("file/dog_fake.jpg", mime=True))
コードの内容は、これ以上ないほどにシンプルです。
上記を実行した結果は、以下。
image/png image/jpeg image/jpeg image/gif image/png
注目ポイントは、2つです。
1つ目は、jpgはjpeg扱いになるということです。
当たり前ですが、知らない人も中にはいるかもしれません。
2つ目は、python-magicを騙すことはできないということです。
dog_fake.jpgをpngとして判定しています。
MIMEタイプの判定には、python-magicを問題なく使えることが確認できました。
以上、python-magicの動作確認を説明しました。