确定MIME类型是二进制还是基于文本

时间:2010-10-07 06:47:12

标签: python mime-types media-type

是否有一个库可以确定给定的内容类型是二进制还是基于文本?

显然text/*始终是文本的,但对于像application/jsonimage/svg+xml甚至application/x-latex这样的内容,如果不检查实际数据,则相当棘手。

3 个答案:

答案 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"]