如何根据文件名预测文件的 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 类型