假设您想要在某个地方保存一堆文件,例如在blob中。假设您希望通过网页分发这些文件,并让客户端自动打开正确的应用程序/查看器。

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

基于这个假设,除了文件的字节外,还需要保存MIME类型。

如何找到文件的MIME类型?我现在用的是Mac,但这应该也适用于Windows。

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

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


当前回答

我很惊讶没有人提到它,但是pyments能够对mime类型做出有根据的猜测,特别是文本文档。

pyuments实际上是一个Python语法高亮显示库,但它有一个方法,可以根据您的文档是500种受支持的文档类型中的哪一种进行有根据的猜测。 即c++ vs c# vs Python vs等等

import inspect

def _test(text: str):
    from pygments.lexers import guess_lexer
    lexer = guess_lexer(text)
    mimetype = lexer.mimetypes[0] if lexer.mimetypes else None
    print(mimetype)

if __name__ == "__main__":
    # Set the text to the actual defintion of _test(...) above
    text = inspect.getsource(_test)
    print('Text:')
    print(text)
    print()
    print('Result:')
    _test(text)

输出:

Text:
def _test(text: str):
    from pygments.lexers import guess_lexer
    lexer = guess_lexer(text)
    mimetype = lexer.mimetypes[0] if lexer.mimetypes else None
    print(mimetype)


Result:
text/x-python

现在,它不是完美的,但如果您需要能够分辨出500种文档格式中正在使用的是哪一种,这是非常有用的。

其他回答

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'

Python 3参考:https://docs.python.org/3.2/library/mimetypes.html

mimetypes.guess_type(url, strict=True) Guess the type of a file based on its filename or URL, given by url. The return value is a tuple (type, encoding) where type is None if the type can’t be guessed (missing or unknown suffix) or a string of the form 'type/subtype', usable for a MIME content-type header. encoding is None for no encoding or the name of the program used to encode (e.g. compress or gzip). The encoding is suitable for use as a Content-Encoding header, not as a Content-Transfer-Encoding header. The mappings are table driven. Encoding suffixes are case sensitive; type suffixes are first tried case sensitively, then case insensitively. The optional strict argument is a flag specifying whether the list of known MIME types is limited to only the official types registered with IANA. When strict is True (the default), only the IANA types are supported; when strict is False, some additional non-standard but commonly used MIME types are also recognized.

import mimetypes
print(mimetypes.guess_type("sample.html"))

你没有说明你使用的是什么web服务器,但Apache有一个很好的小模块,叫做Mime Magic,它用来确定文件的类型,当被告知这样做。它读取文件的一些内容,并试图根据找到的字符找出文件的类型。正如Dave Webb提到的,python下的MimeTypes模块可以工作,只要有一个方便的扩展。

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

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

如果用户正在上传文件,HTTP post将在数据旁边包含文件的MIME类型。例如,Django将此数据作为UploadedFile对象的属性提供。

这似乎很简单

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

请参阅旧帖

更新-在python 3+版本中,现在更方便了:

import mimetypes
print(mimetypes.guess_type("sample.html"))