假设您想在某处保存一堆文件,例如在BLOB中.假设你想通过网页将这些文件输出,并让客户端自动打开正确的应用程序/查看器.
假设:浏览器通过HTTP响应中的mime-type(content-type?)标头确定要使用的应用程序/查看器.
基于该假设,除了文件的字节外,您还希望保存MIME类型.
您如何找到文件的MIME类型?我目前在Mac上,但这也适用于Windows.
将文件发布到网页时,浏览器是否会添加此信息?
是否有一个整洁的python库来查找这些信息?WebService或(甚至更好)可下载的数据库?
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' >>>
标准库中的mimetypes模块将从文件扩展名中确定/猜测MIME类型.
如果用户正在上传文件,则HTTP帖子将包含文件的MIME类型以及数据.例如,Django使这些数据可用作UploadedFile对象的属性.
比使用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的MIME类型匹配.
这似乎很容易
>>> from mimetypes import MimeTypes >>> import urllib >>> mime = MimeTypes() >>> url = urllib.pathname2url('Upload.xml') >>> mime_type = mime.guess_type(url) >>> print mime_type ('application/xml', None)
请参考Old Post
有3个不同的库包含libmagic.
其中2个在pypi上可用(因此pip安装将起作用):
filemagic
蟒蛇魔法
另外,类似于python-magic可以在最新的libmagic源代码中直接获得,它是你在linux发行版中可能拥有的那个.
在Debian中,包python-magic就是关于这一个,它被用作toivotuo所说的并且它没有像Simon Zimmermann所说的那样(恕我直言).
在我看来是另一种看法(由libmagic的原作者).
太糟糕了,不能直接在pypi上获得.
在python 2.6中:
mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \ stdout=subprocess.PIPE).communicate()[0]
关于该主题的所有不同答案都非常令人困惑,因此我希望通过对libmagic的不同绑定的概述来更加清楚。以前,mammadori给出了一个简短的答案,列出了可用的选项。
模块名称: magic
pypi:文件魔术
来源:https : //github.com/file/file/tree/master/python
确定文件mime-type时,简称为选择的工具,file
其后端称为libmagic
。(请参阅Project主页。)该项目是在私有cvs存储库中开发的,但是github上有一个只读的git mirror。
现在,如果您想将任何libmagic绑定与python一起使用,则需要使用此工具,该工具已经附带了自己的python绑定,称为file-magic
。它们没有太多专用的文档,但是您可以随时查看c-library的手册页:man libmagic
。自述文件中描述了基本用法:
import magic detected = magic.detect_from_filename('magic.py') print 'Detected MIME type: {}'.format(detected.mime_type) print 'Detected encoding: {}'.format(detected.encoding) print 'Detected file type name: {}'.format(detected.name)
除此之外,还可以通过Magic
使用示例文件中magic.open(flags)
所示的创建对象来使用库。
无论toivotuo和ewr2san使用这些file-magic
绑定包含在file
工具。他们错误地假设,他们正在使用该python-magic
程序包。这似乎表明,如果同时安装file
和python-magic
,则python模块将magic
引用前者。
模块名称: magic
pypi:蟒蛇魔术
来源:https : //github.com/ahupp/python-magic
这是西蒙·齐默尔曼(Simon Zimmermann)在回答中谈到的图书馆,该图书馆也被克劳德·库洛姆(Claude COULOMBE)和格林哥·苏阿韦(Gringo Suave)所采用。
模块名称: magic
pypi:filemagic
来源:https : //github.com/aliles/filemagic
注意:该项目的最新更新时间为2013年!
由于基于相同的c-api,因此该库与中file-magic
包含的库有些相似libmagic
。它仅由mammadori提及,没有其他答案使用它。
你没有说明你正在使用什么样的Web服务器,但Apache有一个很好的小模块叫做Mime Magic,它用来确定文件的类型.它会读取文件的一些内容,并根据找到的字符尝试找出它的类型.而正如Dave Webb提到的python下的MimeTypes模块将起作用,只要扩展是很方便的.
或者,如果您坐在UNIX机器上,则可以使用它sys.popen('file -i ' + fileName, mode='r')
来获取MIME类型.Windows应该有一个等效的命令,但我不确定它是什么.
@toivotuo的方法在python3下对我来说效果最好,最可靠.我的目标是识别没有可靠的.gz扩展名的gzip压缩文件.我安装了python3-magic.
import magic filename = "./datasets/test" def file_mime_type(filename): m = magic.open(magic.MAGIC_MIME) m.load() return(m.file(filename)) print(file_mime_type(filename))
对于gzip压缩文件,它返回:application/gzip; 字符集=二进制
对于解压缩的txt文件(iostat数据):text/plain; 字符集= US-ASCII
对于tar文件:application/x-tar; 字符集=二进制
对于bz2文件:application/x-bzip2; 字符集=二进制
最后但并非最不重要的一个.zip文件:application/zip; 字符集=二进制
2017更新
无需转到github,它以其他名称位于PyPi上:
pip3 install --user python-magic # or: sudo apt install python3-magic # Ubuntu distro package
代码也可以简化:
>>> import magic >>> magic.from_file('/tmp/img_3304.jpg', mime=True) 'image/jpeg'