파이썬에서 파일의 MIME 유형을 찾는 방법은 무엇입니까?


194

예를 들어 BLOB와 같은 곳에 여러 파일을 저장하려고한다고 가정 해 봅시다. 웹 페이지를 통해 이러한 파일을 정리하고 클라이언트가 올바른 응용 프로그램 / 뷰어를 자동으로 열도록한다고 가정하겠습니다.

가정 : 브라우저는 HTTP 응답에서 mime-type (content-type?) 헤더가 사용할 애플리케이션 / 뷰어를 파악합니다.

해당 가정을 기반으로 파일의 바이트 외에도 MIME 유형을 저장하려고합니다.

파일의 MIME 유형을 어떻게 찾을 수 있습니까? 저는 현재 Mac에 있지만 Windows에서도 작동합니다.

파일을 웹 페이지에 게시 할 때 브라우저가이 정보를 추가합니까?

이 정보를 찾기위한 깔끔한 파이썬 라이브러리가 있습니까? WebService 또는 다운로드 가능한 데이터베이스입니까?

답변:


218

toivotuo가 제안한 python-magic 방법은 구식입니다. Python-magic의 현재 트렁크는 Github에 있으며 MIME 유형을 찾는 readme를 기반으로 다음과 같이 수행됩니다.

# For MIME types
import magic
mime = magic.Magic(mime=True)
mime.from_file("testdata/test.pdf") # 'application/pdf'

17
의견 주셔서 감사합니다! 순서는 투표로 그룹화되고 그룹 내에서 무작위로 정렬되므로 "위의"는 스택 오버 플로우에서 어려운 개념입니다. @toivotuo의 답변을 참조하는 것 같습니다.
Daren Thomas

1
그러나이 답글을 작성할 때 의견을 작성하기에 "포인트"가 충분하지 않았습니다. 그러나 @toivotuo가 그의 질문을 편집 할 수 있도록 주석으로 작성했을 것입니다.
Simon Zimmermann

1
rpm -qf /usr/lib/python2.7/site-packages/magic.py -i URL : darwinsys.com/file 요약 : libmagic API에 대한 Python 바인딩 rpm -qf / usr / bin / file -i 이름 : 파일 URL : darwinsys.com/file 에서 파이썬 - 마법 darwinsys.com/file 의 말 toivotuo와 리눅스 페도라와 함께 제공 @처럼 작동합니다. 그리고 더 주류 인 것 같습니다.
Sérgio

7
python-magic이라는 debian / ubuntu 패키지는 같은 이름의 pip 패키지와 다릅니다. 둘 다 import magic호환되지 않는 내용입니다. 자세한 내용은 stackoverflow.com/a/16203777/3189 를 참조하십시오 .
Hamish Downer

1
toivotuo의 답변에 대해 언급했듯이 구식이 아닙니다! 다른 도서관에 대해 이야기하고 있습니다. 답변에서 해당 진술을 삭제하거나 대체 할 수 있습니까? 현재 최상의 솔루션을 찾는 것이 매우 어렵습니다.
bodo 2018 년

87

표준 라이브러리 의 mimetypes 모듈 은 파일 확장자에서 MIME 유형을 결정 / 추측합니다.

사용자가 파일을 업로드하는 경우 HTTP 게시물에는 데이터와 함께 파일의 MIME 유형이 포함됩니다. 예를 들어 Django는이 데이터를 UploadedFile 객체 의 속성으로 사용할 수있게 합니다.


12
질문에 지정된대로 파일이 BLOB에 저장된 경우 파일 확장자를 알 수 없습니다.
기계 달팽이

55
파일 확장자는 MIME 유형을 결정하는 신뢰할 수있는 방법이 아닙니다.
Cerin

13
import mimetypes mimetypes.MimeTypes().guess_type(filename)[0]
Jonathan

4
파이썬 3.6에서는 다음과 같이 작동합니다.mimetypes.guess_type(path_file_to_upload)[1]
JinSnow

3
@cerin은 파일 확장자가 신뢰할 수 없다는 것이 맞지만 github.com/s3tools/s3cmd/issues/198에서 확인한 python-magic것처럼 (최고의 답변에서 제안한) 정확도 가 훨씬 낮다는 것을 알았습니다 . 따라서 mimetypes나를 위해 더 나은 후보로 보입니다.
danqing

46

mimetypes 라이브러리를 사용하는 것보다 더 안정적인 방법은 python-magic 패키지를 사용하는 것입니다.

import magic
m = magic.open(magic.MAGIC_MIME)
m.load()
m.file("/tmp/document.pdf")

이것은 file (1)을 사용하는 것과 같습니다.

장고에서는 MIME 형식이 UploadedFile.content_type과 일치하는지 확인할 수도 있습니다.


2
Python-magic의 업데이트 된 사용법에 대해서는 Simon Zimmermann의 게시물을 참조하십시오
Daren Thomas

@DarenThomas : mammadori의 답변에서 언급 했듯이이 답변은 구식 이 아니며 Simon Zimmermann의 솔루션과 다릅니다. 파일 유틸리티가 설치되어 있으면이 솔루션을 사용할 수 있습니다. 파일 -5.32에서 작동합니다. 젠투에서는 파일 패키지에 python USE-flag를 활성화해야합니다.
bodo 2018 년

36

이것은 매우 쉬운 것 같습니다

>>> 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를 참조하십시오

업데이트 -@Garrets 의견에 따라 python 3에서는 더 간단합니다.

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

4
귀하의 예제에서 urllib이 필요하다고 생각하지 않습니다.
BrotherJack

5
Python 3.X의 경우 urllib 가져 오기 요청에서 urllib 가져 오기를 바꾸십시오. 그리고 urllib 대신 "요청"을 사용하십시오
Arjun Thakur

1
Python 2.7에서도 작동
Jay Modi

@oetzi의 솔루션 은이 모듈을 사용하지만 더 간단합니다.
Garrett

11

libmagic을 감싸는 3 개의 서로 다른 라이브러리가 있습니다.

그중 2 개는 pypi에서 사용할 수 있습니다 (pip 설치가 작동합니다).

  • filemagic
  • 파이썬 매직

그리고 python-magic과 유사한 또 다른 파일은 최신 libmagic 소스에서 직접 사용할 수 있으며 Linux 배포판에있을 수 있습니다.

데비안에서 python-magic 패키지는 이것에 관한 것이며 toivotuo로 사용되며 Simon Zimmermann이 말한대로 사용되지 않습니다 (IMHO).

libmagic의 원래 작성자가 다른 테이크를 취하는 것 같습니다.

너무 나쁜 것은 pypi에서 직접 사용할 수 없습니다.


편의를 위해 repo를 추가했습니다 : github.com/mammadori/magic-python 당신이 할 수있는 방법 : pip install -e git://github.com/mammadori/magic-python.git#egg=Magic_file_extensions
mammadori

10

파이썬 2.6에서 :

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

6
file명령은 기본적으로 libmagic의 래퍼 이므로 필요하지 않습니다. Simon의 대답과 같이 Python 바인딩 (python-magic)을 사용할 수도 있습니다.
기계 달팽이

6
운영 체제에 따라 다릅니다. 예를 들어, Mac OS X의 경우 "파일"이 있지만 일반 환경에서는 libmagic이 아닙니다.
rptb1

9

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'

js 또는 css 파일에 대해 동일한 작업을 수행 할 수 있습니까?
kumbhanibhavesh

물론이지?
Gringo Suave

9

libmagic에 대한 파이썬 바인딩

이 주제에 대한 모든 대답은 매우 혼란 스럽습니다 .libmagic의 다른 바인딩에 대한이 개요를 조금 더 명확하게하고 싶습니다. 이전에 mammadori는 사용 가능한 옵션을 나열한 짧은 답변을 제공했습니다.

libmagic

파일 MIME 유형을 결정할 때 선택한 도구를 간단히 호출 file하고 백엔드를 호출 libmagic합니다. ( 프로젝트 홈 페이지 참조 ) 프로젝트는 개인 cvs 저장소에서 개발되었지만 github 에는 읽기 전용 git mirror가 있습니다.

이제 파이썬과 함께 libmagic 바인딩을 사용하려는 경우 필요한이 도구에는 이미라는 자체 파이썬 바인딩이 포함되어 file-magic있습니다. 전용 문서는 많지 않지만 항상 c-library의 man 페이지를 볼 수 있습니다 man libmagic. 기본 사용법은 readme 파일에 설명되어 있습니다 .

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설치되어, 파이썬 모듈은 magic이전의 일을 말한다.

파이썬 매직

이것은 Simon Zimmermann이 그의 답변 에서 이야기하는 라이브러리이며 Gringo Suave 뿐만 아니라 Claude COULOMBE 도 사용합니다 .

filemagic

참고 :이 프로젝트는 2013 년에 마지막으로 업데이트되었습니다!

동일한 c-api를 기반으로하기 때문에이 라이브러리는에 file-magic포함 된 것과 유사 libmagic합니다. 그것은 mammadori에 의해서만 언급되었으며 다른 대답으로는 그것을 사용하지 않습니다.


7

@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; charset = us-ascii

tar 파일의 경우 : application / x-tar; 문자 집합 = 이진

bz2 파일의 경우 : application / x-bzip2; 문자 집합 = 이진

마지막으로 .zip 파일은 다음과 같습니다. application / zip; 문자 집합 = 이진


7

파이썬 3 심판 : https://docs.python.org/3.2/library/mimetypes.html

mimetypes.guess_type (url, strict = True) url에서 제공 한 파일 이름 또는 URL을 기준으로 파일 유형을 추측합니다. 리턴 값은 튜플 (유형, 인코딩)이며, 유형을 추측 할 수없는 경우 (접미사 누락 또는 알 수없는 접미어) 또는 '유형 / 하위 유형'형식의 문자열 (MIME 컨텐츠 유형 헤더에 사용 가능) 인 경우 유형은 없음입니다.

인코딩은 인코딩이 없거나 인코딩에 사용 된 프로그램 이름 (예 : 압축 또는 gzip)의 경우 None입니다. 인코딩은 Content-Transfer-Encoding 헤더가 아닌 Content-Encoding 헤더로 사용하기에 적합합니다. 매핑은 테이블 중심입니다. 인코딩 접미사는 대소 문자를 구분합니다. 유형 접미사는 먼저 대소 문자를 구분하여 시도한 다음 대소 문자를 구분하지 않습니다.

선택적 strict 인수는 알려진 MIME 유형 목록이 IANA에 등록 된 공식 유형으로 만 제한되는지 여부를 지정하는 플래그입니다. strict가 True이면 (기본값) IANA 유형 만 지원됩니다. strict가 False이면 일부 비표준이지만 일반적으로 사용되는 MIME 유형도 인식됩니다.

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

6

어떤 웹 서버를 사용하고 있는지 말하지 않았지만 Apache에는 Mime Magic 이라는 멋진 작은 모듈이 있습니다.이 모듈 에는 파일 유형을 결정하는 데 사용됩니다. 파일의 일부 내용을 읽고 찾은 문자를 기반으로 파일 형식을 파악하려고 시도합니다. 로 그리고 데이브 웹이 언급 MIME 형식 모듈 작동 파이썬 아래를, 확장이 편리 제공.

또는 UNIX 상자에 앉아있는 sys.popen('file -i ' + fileName, mode='r')경우 MIME 유형을 가져 오는 데 사용할 수 있습니다 . Windows에는 동등한 명령이 있어야하지만 그것이 무엇인지 확실하지 않습니다.


7
요즘 당신은 subprocess.check_output ([ 'file', '-b', '--mime', filename])을 할 수 있습니다
Nathan Villaescusa

python-magic이 동등한 기능을 수행 할 때 외부 도구를 사용해야 할 이유는 없습니다.
damd mar

4

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)

전체 파일을로드합니까?
吴毅 凡

아니요, 스트림이므로 일반적으로 몇 바이트입니다.
Claude COULOMBE

response.readline () 또는 response.read (128)에 의해 편집되었습니다. 감사합니다!
Claude COULOMBE

3

mimetypes 라이브러리를 먼저 시도하십시오. 작동하지 않으면 python-magic libary를 대신 사용하십시오.

import mimetypes
def guess_type(filename, buffer=None):
mimetype, encoding = mimetypes.guess_type(filename)
if mimetype is None:
    try:
        import magic
        if buffer:
            mimetype = magic.from_buffer(buffer, mime=True)
        else:
            mimetype = magic.from_file(filename, mime=True)
    except ImportError:
        pass
return mimetype

1

mimetypes 모듈은 파일 확장자를 기준으로 파일 유형을 인식합니다. 확장명이없는 파일의 파일 형식을 복구하려고하면 mimetypes가 작동하지 않습니다.


3
나는 그것이 사실이라고 생각하지 않습니다. MIME 형식은 데이터 형식을 직접 찾는 방법이 아니라 데이터 형식에 대해 다른 사람에게 알리는 방법에 관한 것입니다. 확장자 만 기준으로 형식을 추측하고 MIME 유형을 인쇄하는 도구를 사용하는 경우 파일 확장자가 없으면 해당 도구를 사용할 수 없습니다. 그러나 형식을 추측하는 다른 방법도 예를 들어 파서로 확인하여 가능합니다.
erikbwork

1

나는 아무도 그것을 언급하지 않은 것에 놀랐다. 그러나 피그먼트 는 특히 텍스트 문서의 MIME 유형에 대해 교육받은 추측을 할 수있다.

피그먼트는 실제로 파이썬 구문 강조 라이브러리이지만 문서가 지원하는 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 가지 문서 형식을 사용하고 있는지 알 필요가 있다면 이것은 매우 유용합니다.


0

나는 많은 예제를 시도했지만 Django mutagen으로 훌륭하게 재생됩니다.

파일이 있는지 확인하는 예제 mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

try:
    audio = MP3(file)
except HeaderNotFoundError:
    raise ValidationError('This file should be mp3')

단점은 파일 형식을 확인하는 기능이 제한되어 있지만 파일 형식 만 확인하고 추가 정보에 액세스하려는 경우 좋은 방법입니다.


나는 또한 보안을 점검 할 필요가
아르 템 Bernatskyi


0

바이트 배열 유형 데이터의 경우 magic.from_buffer (_byte_array, mime = True)를 사용할 수 있습니다


-1

imghdr Python 모듈을 사용할 수 있습니다 .


1
이것은 유용한 설명이 아닙니다. 예를 들어 설명하지 않았으며 imghdr이 여기서 어떻게 또는 왜 도움이 될지를 실제로 말하지 않기 때문입니다.
erikbwork

2
예, 이해합니다 1 년이 지났지 만 나처럼이 질문을하는 사람들이 여전히 있기 때문에 여전히 업데이트 할 수 있습니다. 도움이 필요하면 말씀해주세요.
erikbwork

1
매우 제한된 이미지 유형 목록에서만 작동합니다. 텍스트 파일, 압축 된 아카이브, 문서 형식 등에
대해서는 전혀 모릅니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.