【问题标题】:How to predict the mime type of a file based on its name?如何根据文件名预测文件的 MIME 类型?
【发布时间】: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'
【问题讨论】:
标签:
python
mime-types
mime
【解决方案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。