python-magic:檢測檔案的MIME型別

luckzack發表於2024-05-07

簡介

python-magic是一個Python封裝的檔案型別識別庫,它基於libmagic庫。libmagic是一個強大的檔案型別識別工具,它可以分析檔案內容來確定檔案的MIME型別。透過python-magic,我們可以在Python指令碼中輕鬆地呼叫這個功能,無論是用於檔案處理、上傳下載的檔案型別檢查,還是在自動化指令碼中,都非常有用。

特點

  • 易於使用python-magic提供了一個簡單的API,透過簡單的函式呼叫,你可以獲取檔案的MIME型別。
  • 識別率高python-magic封裝了libmagic檔案型別識別庫,識別率高。

工作原理

python-magic封裝了libmagic檔案型別識別庫。libmagic是一個檔案型別識別庫,它透過檢查檔案的魔數(magic number)來確定檔案的型別。魔數是檔案開頭的一些特定位元組,不同的檔案型別有不同的魔數。libmagic庫中包含了一個檔案型別資料庫,用於儲存不同檔案型別的魔數資訊。當python-magic庫被呼叫時,它會讀取目標檔案的開頭幾個位元組,然後與libmagic庫中的檔案型別資料庫進行匹配,從而確定檔案的型別。

安裝

在開始使用python-magic之前,我們需要先安裝它。python-magic可以透過pip進行安裝。在命令列中執行以下命令:

pip install python-magic

如果你使用的是Windows系統,還需要安裝libmagic的Windows版本。下載後,將libmagic的安裝目錄新增到系統的PATH環境變數中。
在macOS上,你也可以使用Homebrew來安裝libmagic:

brew install libmagic

如何使用

基本用法

使用python-magic識別檔案型別非常簡單。首先,我們需要匯入magic模組。然後,建立一個magic.Magic物件。最後,呼叫該物件的from_file()方法,傳入要識別的檔案路徑,即可得到檔案型別。

import magic
# 建立magic物件
m = magic.Magic()
# 識別檔案型別
file_path = "example.txt"
file_type = m.from_file(file_path)
print(file_type)  # 輸出:ASCII text

其他示例

python-magic還可以用於多種場景,下面我們來看其他一些示例。

檢查未知檔案

file_path = 'unknown_file.bin'
mime_type = m.from_file(file_path)
print(f"This unknown file is of type {mime_type}")

檢查遠端檔案

如果你有一個URL,你也可以檢查遠端檔案的型別:

url = 'http://example.com/file.zip'
mime_type = m.from_url(url)
print(f"The remote file at {url} is of type {mime_type}")

識別圖片型別

import magic
m = magic.Magic(mime=True)
file_path = "example.jpg"
file_type = m.from_file(file_path)
print(file_type)  # 輸出:image/jpeg

識別多個檔案型別

import magic
m = magic.Magic()
file_paths = ["example.txt", "example.jpg", "example.mp3"]
for file_path in file_paths:
    file_type = m.from_file(file_path)
    print(f"{file_path}: {file_type}")

高階用法

自定義檔案型別資料庫

python-magic還提供了一些高階用法,例如自定義檔案型別資料庫、設定檔案型別識別的深度等。以下是一個自定義檔案型別資料庫的例子:

import magic
# 建立magic物件,指定自定義的檔案型別資料庫
m = magic.Magic(magic_file="path/to/magic.mgc")
# 識別檔案型別
file_path = "example.txt"
file_type = m.from_file(file_path)
print(file_type)  # 輸出:ASCII text

有時候,我們可能需要識別一些特殊的檔案型別,而這些檔案型別在python-magic的預設檔案型別資料庫中並沒有定義。這時,我們可以自定義檔案型別資料庫。自定義檔案型別資料庫是一個文字檔案,每一行定義一個檔案型別。每一行的格式如下:

>0 string magic_string magic_description

這行程式碼是magic檔案格式的一部分,用於定義檔案型別的識別規則。在magic檔案中,每一行定義了一個規則,用於識別特定的檔案型別。各部分的含義如下:

  • >0:表示從檔案的開始處(偏移量為0)開始檢查。
  • string:表示要檢查的是字串型別的資料。
  • magic_string:是要查詢的特定字串,也就是魔數(magic number),它是檔案型別識別的關鍵。
  • magic_description:當檔案中包含magic_string時,magic庫會返回這個描述,表示檔案的型別。

例如,對於ZIP檔案的識別規則,magic檔案中可能會有類似這樣的一行:

>0 string PK\003\004 Zip archive data

這樣就可以定義一個簡單的檔案型別資料庫custom.magic。這意味著,如果檔案的開頭是字串PK\003\004,那麼magic庫會識別這個檔案為ZIP歸檔檔案,並返回描述Zip archive data
然後,我們可以使用這個自定義的檔案型別資料庫來建立magic.Magic物件:

import magic
m = magic.Magic(magic_file="custom.magic")
file_path = "example.zip"
file_type = m.from_file(file_path)
print(file_type)  # 輸出:Zip archive data

設定檔案型別識別的深度

有時候,我們可能只需要識別檔案的開頭一部分內容,而不需要讀取整個檔案。這時,我們可以設定檔案型別識別的深度。

import magic
# 建立magic物件,設定檔案型別識別的深度為1024位元組
m = magic.Magic(buffer_size=1024)
file_path = "example.txt"
file_type = m.from_file(file_path)
print(file_type)  # 輸出:ASCII text

透過設定buffer_size引數,我們可以控制python-magic讀取檔案的位元組大小。這樣可以提高檔案型別識別的速度,尤其是在處理大檔案時。

總結

python-magic是一個功能強大的Python庫,可以幫助我們輕鬆識別檔案的型別。它易於安裝和使用,並且提供了豐富的API供我們進行高階定製。無論你是需要快速識別檔案型別,還是需要深入處理不同型別的檔案,python-magic都是一個不錯的選擇。

附錄

常見問題解答

  1. Q:我在Windows上安裝python-magic時遇到了問題,怎麼辦?

A: 請確保你已經安裝了libmagic的Windows版本,並且已經將libmagic的安裝目錄新增到了系統的PATH環境變數中。

  1. Q:python-magic可以識別所有的檔案型別嗎?

A:python-magic可以識別大多數常見的檔案型別,但並不是所有的檔案型別都能被識別。如果遇到無法識別的檔案型別,可以嘗試更新libmagic的檔案型別資料庫,或者自定義檔案型別資料庫。

  1. Q:如何更新libmagic的檔案型別資料庫?

A: 你可以從這裡下載最新的libmagic原始碼,然後按照官方文件進行編譯和安裝。這將更新你的檔案型別資料庫。

參考文獻

  • python-magic官方文件:https://github.com/ahupp/python-magic

相關文章