首页 文章

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

提问于
浏览
148

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

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

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

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

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

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

16 回答

  • 22

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

  • 6

    对于字节数组类型数据,您可以使用magic.from_buffer(_byte_array,mime = True)

  • 5

    这似乎很容易

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

  • 2

    有3个不同的库包含libmagic .

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

    • filemagic

    • python-magic

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

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

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

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

  • 8

    在python 2.6中:

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

    你可以使用 imghdr Python模块 .

  • 43

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

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

  • 6

    我尝试了很多例子,但是Django mutagen很好玩 .

    检查文件是否为 mp3 的示例

    from mutagen.mp3 import MP3, HeaderNotFoundError  
    
    try:
        audio = MP3(file)
    except HeaderNotFoundError:
        raise ValidationError('This file should be mp3')
    

    缺点是您检查文件类型的能力有限,但如果您不仅要检查文件类型还要访问其他信息,这是一个很好的方法 .

  • 75

    mimetypes模块只根据文件扩展名识别文件类型 . 如果您尝试恢复没有扩展名的文件的文件类型,mimetypes将无法正常工作 .

  • 3

    2017 Update

    不需要去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'
    
  • -1

    toivotuo建议的python-magic方法已经过时了 . Python-magic's当前主干在Github上,根据自述文件,找到MIME类型,就像这样 .

    # For MIME types
    >>> import magic
    >>> mime = magic.Magic(mime=True)
    >>> mime.from_file("testdata/test.pdf")
    'application/pdf'
    >>>
    
  • 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的MIME类型匹配 .

  • 0

    在Python 3.x和webapp中,文件的url没有扩展名或伪扩展名 . 你应该使用安装python-magic

    pip3 install python-magic
    

    对于Mac OS X,您还应该安装libmagic

    brew install libmagic
    

    代码段

    import urllib
    import magic
    from urllib.request import urlopen
    
    url = "http://...url to the file ..."
    request = urllib.request.Request(url)
    response = urlopen(request)
    mime_type = magic.from_buffer(response.readline())
    print(mime_type)
    

    或者你可以在阅读中加入一个大小

    import urllib
    import magic
    from urllib.request import urlopen
    
    url = "http://...url to the file ..."
    request = urllib.request.Request(url)
    response = urlopen(request)
    mime_type = magic.from_buffer(response.read(128))
    print(mime_type)
    
  • 0

    这可能已经过时了,但为什么不直接从Django使用UploadedFile.content_type?不一样吗?(https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type

  • 10

    Python绑定到libmagic

    关于这个主题的所有不同答案都非常混乱,所以我希望能够更清楚地了解libmagic不同绑定的概述 . 以前,mammadori给出了short answer列出可用选项 .

    libmagic

    在确定文件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中描述:

    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) ,如example file所示 .

    toivotuo和ewr2san都使用 file 工具中包含的这些 file-magic 绑定 . 他们错误地认为,他们正在使用 python-magic 包 . 这似乎表明,如果安装了 filepython-magic ,则python模块 magic 指的是前者 .

    python-magic

    这是Simon Zimmermann在his answer中讨论过的图书馆,也是Claude COULOMBE以及Gringo Suave所使用的图书馆 .

    filemagic

    Note :这个项目最后更新是在2013年!

    由于基于相同的c-api,该库与 libmagic 中包含的 file-magic 有一些相似之处 . 它仅由mammadori提及,没有其他答案使用它 .

  • 3

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

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

相关问题