当前位置:  开发笔记 > 编程语言 > 正文

如何在python中找到文件的mime类型?

如何解决《如何在python中找到文件的mime类型?》经验,为你挑选了10个好方法。

假设您想在某处保存一堆文件,例如在BLOB中.假设你想通过网页将这些文件输出,并让客户端自动打开正确的应用程序/查看器.

假设:浏览器通过HTTP响应中的mime-type(content-type?)标头确定要使用的应用程序/查看器.

基于该假设,除了文件的字节外,您还希望保存MIME类型.

您如何找到文件的MIME类型?我目前在Mac上,但这也适用于Windows.

将文件发布到网页时,浏览器是否会添加此信息?

是否有一个整洁的python库来查找这些信息?WebService或(甚至更好)可下载的数据库?



1> Simon Zimmer..:

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'
>>>


谢谢你的评论!请注意,"above"在stackoverflow中是一个困难的概念,因为排序按投票分组并在组内随机排序.我猜你是指@toivotuo的回答.
请注意,名为python-magic的debian/ubuntu包与同名的pip包不同.两者都是`import magic`但内容不兼容.有关更多信息,请参见http://stackoverflow.com/a/16203777/3189.

2> Dave Webb..:

标准库中的mimetypes模块将从文件扩展名中确定/猜测MIME类型.

如果用户正在上传文件,则HTTP帖子将包含文件的MIME类型以及数据.例如,Django使这些数据可用作UploadedFile对象的属性.


文件扩展名不是确定mime类型的可靠方法.
如果文件存储在BLOB中,如问题中所指定,则您可能不知道文件扩展名.
`import mimetypes``mimetypes.MimeTypes().guess_type(filename)[0]`
如果有一个例子,这个答案会更好.
在python 3.6中,这有效:`mimetypes.guess_type(path_file_to_upload)[1]`
@cerin表示文件扩展名不可靠是正确的,但我刚刚发现,如https://github.com/所确认的,python-magic`的准确性(如顶部答案中所建议的)甚至更低。 s3tools / s3cmd / issues / 198。因此,“ mimetypes”对我来说似乎是一个更好的选择。

3> 小智..:

比使用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类型匹配.


请参阅Simon Zimmermann的帖子,了解python-magic的更新用法

4> Laxmikant Ra..:

这似乎很容易

>>> 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


for Python 3.X用urllib import request替换import urllib.然后使用"request"而不是urllib
我不认为你的例子中需要urllib.

5> 小智..:

有3个不同的库包含libmagic.

其中2个在pypi上可用(因此pip安装将起作用):

filemagic

蟒蛇魔法

另外,类似于python-magic可以在最新的libmagic源代码中直接获得,它是你在linux发行版中可能拥有的那个.

在Debian中,包python-magic就是关于这一个,它被用作toivotuo所说的并且它没有像Simon Zimmermann所说的那样(恕我直言).

在我看来是另一种看法(由libmagic的原作者).

太糟糕了,不能直接在pypi上获得.



6> apito..:

在python 2.6中:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]


这是不必要的,因为`file`命令基本上只是libmagic的包装器.您也可以使用python绑定(python-magic),就像Simon的回答一样.
这取决于操作系统.例如,在Mac OS X上,您在正常环境中拥有"文件"但不具有libmagic.

7> bodo..:
Python绑定到libmagic

关于该主题的所有不同答案都非常令人困惑,因此我希望通过对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程序包。这似乎表明,如果同时安装filepython-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提及,没有其他答案使用它。



8> akdom..:

你没有说明你正在使用什么样的Web服务器,但Apache有一个很好的小模块叫做Mime Magic,它用来确定文件的类型.它会读取文件的一些内容,并根据找到的字符尝试找出它的类型.而正如Dave Webb提到的python下的MimeTypes模块将起作用,只要扩展是很方便的.

或者,如果您坐在UNIX机器上,则可以使用它sys.popen('file -i ' + fileName, mode='r')来获取MIME类型.Windows应该有一个等效的命令,但我不确定它是什么.


现在你可以做subprocess.check_output(['file',' - b',' - mime',filename])

9> 小智..:

@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; 字符集=二进制



10> Gringo Suave..:

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'

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有