假设您想在某处保存一堆文件,例如在BLOB中 . 假设你想通过网页将这些文件输出,并让客户端自动打开正确的应用程序/查看器 .
假设:浏览器通过HTTP响应中的mime-type(content-type?)标头确定要使用的应用程序/查看器 .
基于该假设,除了文件的字节外,您还希望保存MIME类型 .
您如何找到文件的MIME类型?我目前在Mac上,但这也适用于Windows .
将文件发布到网页时,浏览器是否会添加此信息?
有没有一个整洁的python库来查找这些信息? WebService或(甚至更好)可下载的数据库?
16 回答
@toivotuo的方法在python3下对我来说效果最好,最可靠 . 我的目标是识别没有可靠的.gz扩展名的gzip压缩文件 . 我安装了python3-magic .
对于一个gzip压缩文件,它返回:application / gzip;字符集=二进制
对于解压缩的txt文件(iostat数据):text / plain;字符集= US-ASCII
对于tar文件:application / x-tar;字符集=二进制
对于bz2文件:application / x-bzip2;字符集=二进制
最后但并非最不重要的是.zip文件:application / zip;字符集=二进制
对于字节数组类型数据,您可以使用magic.from_buffer(_byte_array,mime = True)
这似乎很容易
请参考Old Post
有3个不同的库包含libmagic .
其中2个在pypi上可用(因此pip安装将起作用):
filemagic
python-magic
另外,类似于python-magic可以在最新的libmagic源代码中直接获得,它是你在linux发行版中可能拥有的那个 .
在Debian中,包python-magic就是关于这一个,它被用作toivotuo说,并且它没有像Simon Zimmermann所说的那样(恕我直言) .
在我看来,另一种看法(由libmagic的原作者) .
太糟糕了,不能直接在pypi上获得 .
在python 2.6中:
你可以使用 imghdr Python模块 .
标准库中的mimetypes module将从文件扩展名中确定/猜测MIME类型 .
如果用户正在上载文件,则HTTP帖子将包含文件的MIME类型以及数据 . 例如,Django使这些数据可用作UploadedFile对象的属性 .
我尝试了很多例子,但是Django mutagen很好玩 .
检查文件是否为
mp3
的示例缺点是您检查文件类型的能力有限,但如果您不仅要检查文件类型还要访问其他信息,这是一个很好的方法 .
mimetypes模块只根据文件扩展名识别文件类型 . 如果您尝试恢复没有扩展名的文件的文件类型,mimetypes将无法正常工作 .
2017 Update
不需要去github,它是以不同的名字在PyPi上:
代码也可以简化:
toivotuo建议的python-magic方法已经过时了 . Python-magic's当前主干在Github上,根据自述文件,找到MIME类型,就像这样 .
比使用mimetypes库更可靠的方法是使用python-magic包 .
这相当于使用file(1) .
在Django上,还可以确保MIME类型与UploadedFile.content_type的MIME类型匹配 .
在Python 3.x和webapp中,文件的url没有扩展名或伪扩展名 . 你应该使用安装python-magic
对于Mac OS X,您还应该安装libmagic
代码段
或者你可以在阅读中加入一个大小
这可能已经过时了,但为什么不直接从Django使用UploadedFile.content_type?不一样吗?(https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type)
Python绑定到libmagic
关于这个主题的所有不同答案都非常混乱,所以我希望能够更清楚地了解libmagic不同绑定的概述 . 以前,mammadori给出了short answer列出可用选项 .
libmagic
模块名称:
magic
pypi:file-magic
来源:https://github.com/file/file/tree/master/python
在确定文件mime-type时,选择的工具简称为
file
,其后端称为libmagic
. (参见Project home page . )该项目是在私有cvs-repository中开发的,但有一个read-only git mirror on github .现在这个工具,如果你想使用任何与python的libmagic绑定,你将需要它已经有自己的python绑定名为file-magic . 它们没有太多专用文档,但您可以随时查看c-library的手册页:man libmagic . 基本用法在readme file中描述:
除此之外,您还可以通过使用创建
Magic
对象来使用该库magic.open(flags)
,如example file所示 .toivotuo和ewr2san都使用
file
工具中包含的这些file-magic
绑定 . 他们错误地认为,他们正在使用python-magic
包 . 这似乎表明,如果安装了file
和python-magic
,则python模块magic
指的是前者 .python-magic
模块名称:
magic
pypi:python-magic
来源:https://github.com/ahupp/python-magic
这是Simon Zimmermann在his answer中讨论过的图书馆,也是Claude COULOMBE以及Gringo Suave所使用的图书馆 .
filemagic
模块名称:
magic
pypi:filemagic
来源:https://github.com/aliles/filemagic
Note :这个项目最后更新是在2013年!
由于基于相同的c-api,该库与
libmagic
中包含的file-magic
有一些相似之处 . 它仅由mammadori提及,没有其他答案使用它 .你没有说明你正在使用什么样的Web服务器,但是Apache有一个很好的小模块叫做Mime Magic,它用来确定文件的类型 . 它读取文件的一些内容,并尝试根据找到的字符确定它的类型 . 而作为Dave Webb Mentioned,python下的MimeTypes Module将起作用,只要扩展名很方便 .
或者,如果您坐在UNIX框上,则可以使用
sys.popen('file -i ' + fileName, mode='r')
来获取MIME类型 . Windows应该有一个等效的命令,但我不确定它是什么 .