一、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库计算文件类型: 更准确
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通过文件头判断文件类型 - _小苹果 - 博客园