是否有一个库可以确定给定的内容类型是二进制还是基于文本?
显然text/*
始终是文本的,但对于像application/json
,image/svg+xml
甚至application/x-latex
这样的内容,如果不检查实际数据,则相当棘手。
答案 0 :(得分:2)
有一个用于python的libmagic包装器 - pymagic。这是完成你想要的最简单的方法。请记住,魔法只有指纹一样好。如果某些东西看起来像另一种文件格式,你可能会出现误报,但大多数情况下,pymagic会为你提供所需的东西。
要注意的一件事是检查是否有任何字符在可打印的ASCII范围之外的“简单解决方案”,因为您可能会遇到看起来像二进制的unicode(事实上,是二元的)即使它只是文本内容。
答案 1 :(得分:1)
通常,确定MIME类型的程序也会告诉您字符集。例如,file(1)
(和相应的libmagic)将提供以下输出:
> file --mime-encoding /bin/ls
/bin/ls: binary
> file --mime-encoding /etc/passwd
/etc/passwd: us-ascii
答案 2 :(得分:1)
我不知道二进制和非二进制 MIME 类型的明确列表,但对于 Common MIME types,我认为以下内容做得很好。
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"]