如何根据文件名预测文件的 MIME 类型?

Posted

技术标签:

【中文标题】如何根据文件名预测文件的 MIME 类型?【英文标题】:How to predict the mime type of a file based on its name? 【发布时间】:2020-12-21 00:11:39 【问题描述】:

该函数用于预测文件的mime类型 根据它的名字。如果它无法预测 mime 类型, 它默认为application/octet-stream,也就是任意二进制文件。 我想知道是否有更 Pythonic / 更清洁的方式 写这个函数。

from mimetypes import guess_type

def guess_mime(fname):
    try:
        return tuple(guess_type(fname)[0].split('/'))
    except AttributeError:
        return 'application', 'octet-stream'

【问题讨论】:

【参考方案1】:

使用Magic 库:

import magic
mime = magic.Magic(mime=True)
mime.from_file("testdata/test.pdf") # 'application/pdf'

轻松安装:

pip install python-magic

【讨论】:

【参考方案2】:

在这种情况下,我不会使用 try/except,因为这并不是真正的“异常”行为,而只是 guess_type 返回 None 作为类型的情况。一个普通的旧 if/else 或三元 ... if ... else ... 会更合适,让代码在做什么更清楚,而后者更短:

 def guess_mime(fname):
    _type, _ = mimetypes.guess_type(fname)
    return tuple(_type.split("/")) if _type is not None else "application/octet-stream"

您也可以使用or 来使用_type,或者如果_type 为“假”,则使用默认值。

 def guess_mime(fname):
    _type, _ = mimetypes.guess_type(fname)
    return tuple((_type or "application/octet-stream").split("/"))

当然,在这两种情况下,如果函数也可能返回list,则可能不需要转换为tuple

【讨论】:

以上是关于如何根据文件名预测文件的 MIME 类型?的主要内容,如果未能解决你的问题,请参考以下文章

使用 .NET,如何根据文件签名而不是扩展名找到文件的 mime 类型

使用 .NET,如何根据文件签名而不是扩展名找到文件的 mime 类型

使用 .NET,如何根据文件签名而不是扩展名找到文件的 mime 类型

使用 .NET,如何根据文件签名而不是扩展名找到文件的 mime 类型

从php中的文件名获取mime类型

如何使用 php 在文件上设置 mime 类型?