문제

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

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

이러한 가정에 따라 파일 바이트 외에 MIME 유형도 저장하려고 합니다.

파일의 MIME 유형을 어떻게 찾나요?저는 현재 Mac을 사용하고 있지만 Windows에서도 작동할 것입니다.

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

이 정보를 찾기 위한 깔끔한 Python 라이브러리가 있나요?WebService 또는 (더 나은 경우) 다운로드 가능한 데이터베이스?

도움이 되었습니까?

해결책

toivotuo가 제안한 python-magic 방법은 오래되었습니다. Python-마술 현재 트렁크는 Github에 있으며 거기에 있는 추가 정보를 기반으로 MIME 유형을 찾는 작업은 다음과 같이 수행됩니다.

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

다른 팁

그만큼 마임타입 모듈 표준 라이브러리에서는 파일 확장자로부터 MIME 유형을 결정/추측합니다.

사용자가 파일을 업로드하는 경우 HTTP 게시물에는 데이터와 함께 파일의 MIME 유형이 포함됩니다.예를 들어, Django는 이 데이터를 업로드된파일 물체.

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의 유형과 일치하는지 확인할 수도 있습니다.

이거 엄청 쉬운거 같은데

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

참조하시기 바랍니다 오래된 게시물

libmagic을 래핑하는 3가지 라이브러리가 있습니다.

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

  • 파일 매직
  • 파이썬-매직

그리고 python-magic과 유사한 또 다른 기능은 최신 libmagic 소스에서 직접 사용할 수 있으며 아마도 Linux 배포판에 있을 것입니다.

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

제 생각에는 (libmagic의 원저자가 쓴) 또 다른 해석인 것 같습니다.

안타깝게도 pypi에서는 직접 사용할 수 없습니다.

파이썬 2.6에서:

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

어떤 웹 서버를 사용하고 있는지는 밝히지 않았지만 Apache에는 다음과 같은 멋진 작은 모듈이 있습니다. 마임 매직 그렇게 하라는 지시를 받았을 때 파일의 유형을 결정하는 데 사용됩니다.파일 내용 중 일부를 읽고 발견된 문자를 기반으로 어떤 유형인지 알아내려고 시도합니다.그리고 데이브 웹이 언급됨 그만큼 MimeTypes 모듈 확장 기능이 있으면 Python에서는 작동합니다.

또는 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 파일의 경우 다음을 반환합니다.애플리케이션/gzip;문자셋=바이너리

압축이 풀린 txt 파일(iostat 데이터)의 경우:텍스트/일반;문자셋=us-ascii

tar 파일의 경우:응용프로그램/x-tar;문자셋=바이너리

bz2 파일의 경우:애플리케이션/x-bzip2;문자셋=바이너리

마지막으로 중요한 것은 .zip 파일입니다.애플리케이션/zip;문자셋=바이너리

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)

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'

libmagic에 대한 Python 바인딩

이 주제에 대한 다양한 답변은 모두 매우 혼란스럽기 때문에 libmagic의 다양한 바인딩에 대한 개요를 통해 좀 더 명확하게 설명할 수 있기를 바랍니다.이전에 맘마도리는 짧은 답변 사용 가능한 옵션을 나열합니다.

libmagic

파일 MIME 유형을 결정할 때 선택한 도구는 간단히 호출됩니다. file 백엔드는 다음과 같이 호출됩니다. libmagic.(참조 프로젝트 홈페이지.) 프로젝트는 비공개 cvs-repository에서 개발되었지만 github의 읽기 전용 git 미러.

이제 Python과 함께 libmagic 바인딩을 사용하려는 경우 필요한 이 도구에는 이미 다음과 같은 자체 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) 에 표시된 것처럼 예제 파일.

둘 다 토이보투오 그리고 ewr2san은 이것을 사용합니다 file-magic 에 포함된 바인딩 file 도구.그들은 실수로 가정하고 있습니다. python-magic 패키지. 이는 다음을 나타내는 것 같습니다. 둘 다 file 그리고 python-magic Python 모듈이 설치되어 있습니다. magic 전자를 가리킨다.

파이썬-매직

이것은 Simon Zimmermann이 이야기한 라이브러리입니다. 그의 대답 그리고 그것은 또한에 의해 고용된다 클로드 쿨롱 게다가 그링고 수아베.

파일 매직

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

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

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

나는 많은 예제를 시도했지만 Django를 사용했습니다. 돌연변이 유발물질 잘 놀아요.

파일이 다음과 같은지 확인하는 예 mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

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

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

이미 오래되었을 수도 있지만 Django에서 UploadedFile.content_type을 직접 사용하는 것은 어떨까요?동일하지 않습니다?(https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type)

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

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

당신이 사용할 수있는 imghdr 파이썬 모듈.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top