如何在python中找到文件的mime类型?
假设我们要将一堆文件保存在某个地方,例如在BLOB中。假设我们想通过网页分发这些文件,并让客户端自动打开正确的应用程序/查看器。
假设:浏览器通过HTTP响应中的mime-type(content-type?)标头找出要使用的应用程序/查看器。
基于该假设,除了文件的字节外,我们还希望保存MIME类型。
我们将如何找到文件的MIME类型?我目前在Mac上,但是在Windows上也应该可以使用。
将文件发布到网页时,浏览器是否添加此信息?
有一个整洁的python库可用于查找此信息吗? WebService还是(甚至更好的)可下载数据库?
解决方案
回答
标准库中的mimetypes模块将从文件扩展名确定/猜测MIME类型。
如果用户正在上传文件,则HTTP帖子将在数据旁边包含文件的MIME类型。例如,Django将这些数据作为UploadedFile对象的属性提供。
回答
我们没有说明正在使用的Web服务器,但是Apache有一个称为Mime Magic的漂亮小模块,当告知执行该操作时,它将用于确定文件的类型。它读取文件的某些内容,并尝试根据找到的字符找出文件的类型。就像Dave Webb提到的那样,只要有扩展名,python下的MimeTypes模块就可以使用。
或者,如果我们坐在UNIX机器上,则可以使用sys.popen('file -i'+ fileName,mode ='r')`来获取MIME类型。 Windows应该有一个等效的命令,但是我不确定它是什么。
回答
在python 2.6中:
mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \ stdout=subprocess.PIPE).communicate()[0]
回答
与使用mimetypes库相比,更可靠的方法是使用python-magic软件包。
import magic m = magic.open(magic.MAGIC_MIME) m.load() m.file("/tmp/document.pdf")
这等同于使用file(1)。
在Django上,还可以确保MIME类型与UploadedFile.content_type相匹配。
回答
toivotuo建议的python-magic方法已过时。 Python-magic的当前主干位于Github上,并根据该自述文件找到MIME类型,是这样完成的。
# For MIME types >>> import magic >>> mime = magic.Magic(mime=True) >>> mime.from_file("testdata/test.pdf") 'application/pdf' >>>