判断MIME类型是二进制还是文本格式
有没有一个库可以用来判断某种内容类型是二进制的还是文本的呢?
显然,text/*
这种类型的内容肯定是文本的。但是像 application/json
、image/svg+xml
甚至 application/x-latex
这些类型,就比较复杂了,因为光看类型名并不能确定它们的实际内容,得查看具体的数据才能知道。
3 个回答
2
通常,能够判断MIME类型的程序也会告诉你字符集是什么。例如,file(1)
(以及相关的libmagic库)会给出以下输出:
> file --mime-encoding /bin/ls
/bin/ls: binary
> file --mime-encoding /etc/passwd
/etc/passwd: us-ascii
5
我不知道有没有一个明确的二进制和非二进制MIME类型的列表,但对于常见的MIME类型,我觉得下面这个列表还不错。
def is_binary(mime_type, subtype):
if mime_type == "text":
return False
if mime_type != "application":
return True
return subtype not in ["json", "ld+json", "x-httpd-php", "x-sh", "x-csh", "xhtml+xml", "xml"]
2
有一个叫做pymagic的库,可以在Python中使用libmagic,这个方法是实现你想要的功能最简单的方式。需要注意的是,magic的效果取决于文件的指纹。如果一个文件看起来像另一种格式,可能会出现误判,但大多数情况下,pymagic能满足你的需求。
有一点需要留意的是,简单地检查文件中是否有字符超出了可打印的ASCII范围,这种方法可能不太靠谱。因为你可能会遇到Unicode字符,它们看起来像二进制文件(实际上也可能是二进制),但其实只是文本内容。