python 通过文件头获取文件类型mimetype

一、MIME Type是什么?

资源的媒体类型

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定的应用程序打开。

二、mimetypes库---猜测文件类型

该mimetypes模块在文件名或/URL 与文件扩展名关联的 MIME 类型之间进行转换。提供从文件名到 MIME 类型以及从 MIME 类型到文件扩展名的转换;后一种转换不支持编码。

语法:

    mimetypes.guess_type(url, strict=True)

根据由url给出的文件名或URL猜测文件的类型。返回值是一个元组(type, encoding),如果类型不能被猜测(丢失或未知的后缀)或表单的字符串(可用于MIME 内容类型头),则类型为元组None'type/subtype'

import mimetypes

print(mimetypes.guess_type(r"C:\Users\zq\Desktop\rarlinux-x64-6.0.2.tar.gz"))  # ('application/x-tar', 'gzip')
print(mimetypes.guess_type(r"C:\Users\zq\Desktop\tar.zip")) # ('application/zip', None) 不准

tar.zip文件是直接将tar.tar改名的,故mimetypes计算的文件类型不准确。

三、filetype库精准判断文件类型

一个小巧自由开放Python开发包,主要用来获得文件类型。

功能特色:

  • 简单友好的API

  • 支持宽范围文件类型

  • 提供文件扩展名和MIME类型判断

  • 文件的MIME类型扩展新增

  • 通过文件(图像、视频、音频…)简单分析

  • 可插拔:添加新的自定义类型的匹配

  • 快,即使处理大文件

  • 只需要前261个字节表示的最大文件头,这样你就可以通过一个单字节

  • 依赖自由(只是Python代码,没有C的扩展,没有libmagic绑定)

  • 跨平台文件识别

import filetype

def get_type(file_path):
    kind = filetype.guess(file_path)
    if kind is None:
        print('Cannot guess file type!')
        return
    print('File extension: %s' % kind.extension)
    print('File MIME type: %s' % kind.mime)

get_type(r"C:\Users\zhangqiang\Desktop\rarlinux-x64-6.0.2.tar.gz")
get_type(r"C:\Users\zhangqiang\Desktop\tar.zip")

'''结果
File extension: gz
File MIME type: application/gzip

Cannot guess file type!
'''

四、python-magic库计算文件类型: 更准确

python-magic 是 libmagic 文件类型识别库的 Python 接口。 libmagic 通过根据预定义的文件类型列表检查文件头来识别文件类型。 此功能由 Unix 命令文件提供给命令行。
import magic

# tar.tar文件改名为tar.zip
print(magic.from_file("/home/podding/task_scheduler/tar.zip"))             # tar archive  
print(magic.from_file("/home/podding/task_scheduler/tar.zip", mime=True))  # application/x-tar     



print(magic.from_file("/home/cpu_architecture_cwe_checker_x86_executable"))             # ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.4.0, with debug_info, not stripped
print(magic.from_file("/home/cpu_architecture_cwe_checker_x86_executable", mime=True))  # application/x-executable

五、参考

Python库 使用filetype精确判断文件类型_陈新明博客-CSDN博客_filetype python  

【转】python通过文件头判断文件类型 - _小苹果 - 博客园   

python使用magic模块进行文件类型识别_第一天-CSDN博客_python-magic

python-magic · PyPI

MIME 参考手册

根据引用\[1\]和引用\[3\]的内容,文件类型type可以通过不同的方式来确定。一种方式是使用mimetypes库中的guess_type函数来猜测文件类型。这个函数会根据文件的扩展名来返回一个元组,其中包含文件的类型和编码信息。另一种方式是浏览器根据文件的扩展名来猜测文件类型。浏览器会先检查一个硬编码列表,如果找不到匹配的类型,就会从操作系统的注册表中查找,最后会扫描一个二级硬编码列表。需要注意的是,浏览器猜测文件类型的方式可能会受到系统中安装的应用程序或注册表的影响。因此,对于一些不常见的文件扩展名,浏览器可能无法准确地确定文件的类型,或者返回空字符串。所以开发者最好不要依靠file.type属性作为唯一的验证方案。 #### 引用[.reference_title] - *1* *2* [python 通过文件获取文件类型mimetype](https://blog.csdn.net/leiwuhen92/article/details/122946453)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [由file.type为空字符串或没有读取到文件类型](https://blog.csdn.net/NANAOO/article/details/100554956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值