最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python判斷一個(gè)文件格式的多種實(shí)現(xiàn)方案

 更新時(shí)間:2026年03月06日 08:21:25   作者:諸神緘默不語  
本文將以圖片文件為例,為大家系統(tǒng)介紹一下五種用Python判斷文件真實(shí)格式的方法,并分析它們的優(yōu)缺點(diǎn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

在日常開發(fā)中,我們經(jīng)常需要判斷一個(gè)文件的真實(shí)格式,尤其是在處理用戶上傳、文件解析或數(shù)據(jù)清洗的場(chǎng)景。僅僅依賴文件擴(kuò)展名往往不夠可靠,因?yàn)橛脩艨梢噪S意修改后綴名。本文將以圖片文件為例,介紹幾種用Python判斷文件格式的常見方法,分析它們的優(yōu)缺點(diǎn),并提供完整的代碼實(shí)例。

為什么不能只相信擴(kuò)展名

在Windows或Linux系統(tǒng)中,文件擴(kuò)展名只是文件名的一部分,操作系統(tǒng)并不強(qiáng)制要求其與內(nèi)容匹配。例如,將一個(gè)文本文件重命名為 image.jpg,它依然是一個(gè)文本文件。如果程序僅根據(jù).jpg來解析,就會(huì)出錯(cuò)。因此,從文件內(nèi)容判斷格式才是根本。

下面我們由淺入深,介紹幾種方案。

方法一:基于文件擴(kuò)展名(最基礎(chǔ),最不可靠)

直接使用os.path.splitext獲取文件后綴,然后映射到格式。

代碼示例

import os

def guess_format_by_extension(file_path):
    ext = os.path.splitext(file_path)[1].lower()
    ext_to_format = {
        '.jpg': 'JPEG',
        '.jpeg': 'JPEG',
        '.png': 'PNG',
        '.gif': 'GIF',
        '.bmp': 'BMP',
        '.webp': 'WebP',
    }
    return ext_to_format.get(ext, 'Unknown')

print(guess_format_by_extension(file_path))

輸出: JPEG

優(yōu)點(diǎn)

  • 無需讀取文件內(nèi)容,速度最快。
  • 不需要額外安裝庫。

缺點(diǎn)

  • 完全依賴文件名,易被偽造。
  • 無法識(shí)別無擴(kuò)展名的文件。

方法二:使用mimetypes模塊(同樣基于擴(kuò)展名)

Python標(biāo)準(zhǔn)庫的mimetypes模塊可以根據(jù)擴(kuò)展名猜測(cè)MIME類型,但本質(zhì)還是依賴擴(kuò)展名。

代碼示例

import mimetypes

mime_type, _ = mimetypes.guess_type(file_path)

print(mime_type)

輸出:image/jpeg

優(yōu)點(diǎn)

  • 標(biāo)準(zhǔn)庫,無需安裝。
  • 能返回標(biāo)準(zhǔn)MIME類型(如image/jpeg)。

缺點(diǎn)

  • 依然依賴文件名,不讀取文件內(nèi)容。
  • 對(duì)未知擴(kuò)展名返回None。

方法三:使用python-magic(讀取文件內(nèi)容,準(zhǔn)確度高)

python-magiclibmagic庫的Python綁定,它能根據(jù)文件內(nèi)容識(shí)別MIME類型,是Linux file命令的底層實(shí)現(xiàn)。這是最可靠的方案之一

安裝

Linux和MacOS系統(tǒng)應(yīng)該可以直接安裝:

pip install python-magic

Windows系統(tǒng)上缺少libmagic的DLL,有兩種解決方案,一是直接安裝python-magic-bin,包含了所需DLL:

pip install python-magic-bin

另一種解決方案是安裝libmagic的DLL,谷歌搜索建議用vcpkg安裝,我沒試過:

vcpkg install libmagic

代碼示例

import magic

def guess_format_with_magic(file_path):
    with open(file_path, 'rb') as f:
        file_data = f.read(2048)
    mime_type = magic.from_buffer(file_data, mime=True)
    return mime_type

print(guess_format_with_magic(file_path))

輸出:image/jpeg

這里只讀了前2048個(gè)字節(jié)是因?yàn)閴蜃R(shí)別文件格式了。如果文件較大,可以適當(dāng)增加讀取的字節(jié)數(shù)(如 8192),但 2048 對(duì)常見圖片、文檔等已經(jīng)足夠。

這里是先讀取文件內(nèi)容為流,然后再調(diào)用python-magic。另外還有一個(gè)接口是magic.from_file(filename, mime=True),如果直接傳入字符串格式的文件路徑,文件路徑帶中文時(shí)會(huì)報(bào)錯(cuò)。當(dāng)路徑是純英文時(shí)就可以用:

import magic

print(magic.from_file("p1.jpg", mime=True))

輸出也是:image/jpeg

優(yōu)點(diǎn)

  • 真正基于文件內(nèi)容,準(zhǔn)確度極高。
  • 能夠識(shí)別絕大多數(shù)文件格式(不僅是圖片)。
  • 返回標(biāo)準(zhǔn)的MIME類型,便于程序處理。

缺點(diǎn)

  • 需要安裝第三方庫,且依賴libmagic。
  • 跨平臺(tái)配置稍復(fù)雜(Windows需額外步驟)。

方法四:手動(dòng)檢查文件頭(魔數(shù),Magic Number)

每種文件格式通常在文件開頭有特定的標(biāo)識(shí)字節(jié)(魔數(shù))。例如:

  • JPEG:以FF D8 FF開頭
  • PNG:以\x89PNG\r\n\x1a\n開頭
  • GIF:以GIF87aGIF89a開頭
  • BMP:以BM開頭

我們可以讀取文件前幾個(gè)字節(jié),與已知魔數(shù)對(duì)比。

代碼示例

def check_image_format(file_path):
    with open(file_path, 'rb') as f:
        header = f.read(12)  # 讀取前12字節(jié)通常足夠判斷常見圖片格式

    if header.startswith(b'\xff\xd8\xff'):
        return 'JPEG'
    elif header.startswith(b'\x89PNG\r\n\x1a\n'):
        return 'PNG'
    elif header.startswith(b'GIF87a') or header.startswith(b'GIF89a'):
        return 'GIF'
    elif header.startswith(b'BM'):
        return 'BMP'
    elif header.startswith(b'RIFF') and header[8:12] == b'WEBP':
        # WebP 格式檢查(簡化版)
        return 'WebP'
    else:
        return 'Unknown'

print(check_image_format(file_path))

輸出:JPEG

優(yōu)點(diǎn)

  • 純Python實(shí)現(xiàn),無需外部庫。
  • 速度快,只讀取少量字節(jié)。
  • 可控性強(qiáng),可自定義魔數(shù)表。

缺點(diǎn)

  • 需要維護(hù)魔數(shù)列表,可能遺漏某些變種或新格式。
  • 某些格式的魔數(shù)可能重疊,需要更復(fù)雜的判斷。
  • 僅靠前幾個(gè)字節(jié)有時(shí)無法區(qū)分同一大類下的子類型(如JPEG 2000)。

方法五:針對(duì)圖像:利用圖像處理庫(如Pillow)嘗試打開

如果能用Pillow庫成功打開文件并讀取格式,說明它是一個(gè)可識(shí)別的圖片。這種方法不僅能判斷是不是圖片,還能獲取尺寸、模式等元信息。

安裝

pip install Pillow

代碼示例

from PIL import Image

def guess_format_with_pillow(file_path):
    try:
        with Image.open(file_path) as img:
            return img.format  # 返回 'JPEG', 'PNG' 等
    except Exception:
        return None  # 無法打開,不是圖片或文件損壞

輸出:JPEG

優(yōu)點(diǎn)

  • 專門針對(duì)圖片,不僅能判斷格式,還能驗(yàn)證圖片是否完整。
  • 返回的格式名稱標(biāo)準(zhǔn),且支持多種圖片格式。
  • 可進(jìn)一步獲取圖片信息。

缺點(diǎn)

  • 僅適用于圖片,無法判斷其他類型文件。
  • 需要讀取整個(gè)文件頭甚至部分?jǐn)?shù)據(jù),速度稍慢(但通常可接受)。
  • 如果文件損壞,可能引發(fā)異常(這本身也是一種判斷方式)。

方案對(duì)比總結(jié)

方法準(zhǔn)確性速度依賴適用范圍優(yōu)點(diǎn)缺點(diǎn)
文件擴(kuò)展名極低最快所有文件簡單、快速極易被欺騙
mimetypes最快標(biāo)準(zhǔn)庫所有文件返回MIME類型同擴(kuò)展名,不讀內(nèi)容
python-magic較快python-magic所有文件準(zhǔn)確、標(biāo)準(zhǔn)跨平臺(tái)配置略麻煩
文件頭魔數(shù)中高自定義格式純Python,可控需維護(hù)魔數(shù)表,覆蓋不全
Pillow嘗試打開Pillow圖片文件能驗(yàn)證完整性,獲取元信息僅圖片,非圖片會(huì)拋異常

實(shí)踐建議

  • 如果你需要通用、準(zhǔn)確的文件類型識(shí)別(不限于圖片),首選python-magic
  • 如果項(xiàng)目僅處理圖片,且需驗(yàn)證文件有效性,Pillow是絕佳選擇。
  • 在資源受限或無第三方庫的環(huán)境中,可以手動(dòng)實(shí)現(xiàn)魔數(shù)檢查,但務(wù)必覆蓋常見格式。
  • 永遠(yuǎn)不要單純依賴文件擴(kuò)展名,尤其是在安全敏感的場(chǎng)景(如上傳頭像)。

結(jié)語

判斷文件格式是文件處理的基礎(chǔ),Python提供了多種靈活的方式。從簡單的擴(kuò)展名到基于內(nèi)容的魔數(shù)識(shí)別,再到成熟的第三方庫,開發(fā)者可以根據(jù)項(xiàng)目的具體需求權(quán)衡準(zhǔn)確性、性能和依賴。希望本文的梳理能幫助你選擇合適的方案,寫出更健壯的代碼。

在實(shí)際應(yīng)用中,建議將文件內(nèi)容識(shí)別作為首要手段,并將擴(kuò)展名作為一種輔助驗(yàn)證或默認(rèn)提示。畢竟,真實(shí)的內(nèi)容比名字更值得信任。

到此這篇關(guān)于使用Python判斷一個(gè)文件格式的多種實(shí)現(xiàn)方案的文章就介紹到這了,更多相關(guān)Python判斷文件格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python操作redis方法總結(jié)

    python操作redis方法總結(jié)

    本篇文章給大家總結(jié)了python操作redis的實(shí)際方法和實(shí)例代碼,有興趣的朋友參考學(xué)習(xí)下。
    2018-06-06
  • 使用PyQt5實(shí)現(xiàn)一個(gè)鼠標(biāo)連點(diǎn)器

    使用PyQt5實(shí)現(xiàn)一個(gè)鼠標(biāo)連點(diǎn)器

    這篇文章主要為大家詳細(xì)介紹了如何使用PyQt5實(shí)現(xiàn)一個(gè)鼠標(biāo)連點(diǎn)器,從而對(duì)QVBoxLayout、QHBoxLayout和QStackedWidget進(jìn)行一個(gè)回顧復(fù)習(xí),需要的可以參考一下
    2023-12-12
  • Python ET.parse 模塊功能詳解

    Python ET.parse 模塊功能詳解

    xml.etree.ElementTree(通常簡稱為 ET)是Python標(biāo)準(zhǔn)庫中用于解析和創(chuàng)建XML數(shù)據(jù)的模塊,本文給大家介紹Python ET.parse 模塊功能,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • 基于Python閉包及其作用域詳解

    基于Python閉包及其作用域詳解

    下面小編就為大家?guī)硪黄赑ython閉包及其作用域詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • python實(shí)現(xiàn)簡單的單變量線性回歸方法

    python實(shí)現(xiàn)簡單的單變量線性回歸方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)簡單的單變量線性回歸方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python 高效編程技巧分享

    Python 高效編程技巧分享

    工作中經(jīng)常要處理各種各樣的數(shù)據(jù),遇到項(xiàng)目趕進(jìn)度的時(shí)候自己寫函數(shù)容易浪費(fèi)時(shí)間。Python 中有很多內(nèi)置函數(shù)幫你提高工作效率。
    2020-09-09
  • Python文件路徑os.path函數(shù)深入剖析

    Python文件路徑os.path函數(shù)深入剖析

    這篇文章主要為大家介紹了Python文件路徑os.path函數(shù)深入剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 20非常有用的Python單行代碼分享

    20非常有用的Python單行代碼分享

    有用的 Python 單行代碼片段,只需一行代碼即可解決特定編碼問題!本文將分享20 個(gè) Python 一行代碼,你可以在 30 秒或更短的時(shí)間內(nèi)輕松學(xué)習(xí)它們。這種單行代碼將節(jié)省你的時(shí)間,并使你的代碼看起來更干凈且易于閱讀
    2022-11-11
  • 基于Python開發(fā)圖像數(shù)據(jù)清洗&圖像質(zhì)量檢查工具

    基于Python開發(fā)圖像數(shù)據(jù)清洗&圖像質(zhì)量檢查工具

    隨著目前采集的數(shù)據(jù)集中的圖像越來越多,出現(xiàn)了數(shù)據(jù)格式十分雜亂、質(zhì)量不統(tǒng)一等問題,下面小編就來用Python制作一個(gè)圖像數(shù)據(jù)清洗&圖像質(zhì)量檢查工具吧
    2025-03-03
  • Autopep8的使用(python自動(dòng)編排工具)

    Autopep8的使用(python自動(dòng)編排工具)

    這篇文章主要介紹了Autopep8的使用(python自動(dòng)編排工具),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評(píng)論

焦作市| 汉源县| 蒲江县| 石渠县| 沅陵县| 江津市| 乌兰县| 佛山市| 富蕴县| 柳河县| 沁阳市| 福州市| 紫阳县| 壶关县| 克什克腾旗| 亳州市| 含山县| 庆安县| 洮南市| 鄯善县| 南投县| 巴里| 汉源县| 大邑县| 寿宁县| 吉水县| 岳池县| 南昌县| 东乡| 乌鲁木齐县| 永年县| 边坝县| 南投县| 财经| 九龙坡区| 宾川县| 巩义市| 锡林郭勒盟| 大庆市| 扶绥县| 娱乐|