Hvordan finne mime type en fil i python?

stemmer
142

La oss si at du ønsker å lagre en haug med filer et sted, for eksempel i BLOB. La oss si at du ønsker å rett disse filene ut via en nettside og har klienten automatisk åpne riktig program / viewer.

Forutsetning: Nettleseren finner ut hvilket program / betrakteren til å bruke av mime-type (content-type?) Header i HTTP respons.

Basert på denne forutsetningen, i tillegg til bytes av filen, du også ønsker å spare MIME-typen.

Hvordan ville du med MIME-typen til en fil? Jeg er for tiden på en Mac, men dette bør også fungere på Windows.

Har leseren legge til denne informasjonen når du legger ut filen til nettsiden?

Er det en ryddig python bibliotek for å finne denne informasjonen? En WebService eller (enda bedre) en nedlastbar database?

Publisert på 04/09/2008 klokken 12:07
kilden bruker
På andre språk...                            


18 svar

stemmer
164

Python-magi metode foreslått av toivotuo er utdatert. Python-magic sin nåværende stammen er på Github og basert på readme det, finne den MIME-type, er gjort som dette.

# For MIME types
>>> import magic
>>> mime = magic.Magic(mime=True)
>>> mime.from_file("testdata/test.pdf")
'application/pdf'
>>>
Svarte 02/05/2010 kl. 12:02
kilden bruker

stemmer
73

Den mimetyper modulen i den standard bibliotek vil avgjøre / antar den MIME-type fra en filtype.

Hvis brukerne laster opp filer i HTTP-post vil inneholde MIME-typen til fila sammen dataene. For eksempel, Django gjør denne informasjonen tilgjengelig som en egenskap av UploadedFile objektet.

Svarte 04/09/2008 kl. 12:12
kilden bruker

stemmer
43

Mer pålitelig måte enn å bruke mimetyper bibliotek ville være å bruke den python-magi pakken.

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

Dette ville være ekvivalent med anvendelse av filen (1).

På Django man kunne også sørge for at MIME-typen stemmer overens UploadedFile.content_type.

Svarte 25/01/2010 kl. 16:39
kilden bruker

stemmer
21

Dette synes å være svært enkelt

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

Vennligst referer Old Post

Svarte 13/02/2014 kl. 13:09
kilden bruker

stemmer
10

Det er 3 forskjellige biblioteker som brytes libmagic.

2 av dem er tilgjengelig på PyPI (så pip installere vil fungere):

  • filemagic
  • python-magi

Og en annen, lignende python-magi er tilgjengelig direkte i de nyeste libmagic kilder, og det er det du sannsynligvis har i linux distribusjon.

I Debian pakken python-magi er om dette, og det blir brukt som toivotuo sagt, og det er ikke obsoleted som Simon Zimmermann nevnte (IMHO).

Det virker for meg en annen take (ved den opprinnelige forfatteren av libmagic).

Synd er ikke tilgjengelig direkte på PyPI.

Svarte 06/09/2012 kl. 10:22
kilden bruker

stemmer
8

i python 2,6:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]
Svarte 02/11/2009 kl. 15:48
kilden bruker

stemmer
6

@toivotuo 's metode som fungerte best og mest pålitelig for meg etter python3. Mitt mål var å identifisere gzippede filer som ikke har en pålitelig .gz forlengelse. Jeg installerte python3-magi.

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

for en gzippet fil returnerer: application / gzip; charset = binær

for en utpakkede txt (iostat data): text / plain; charset = us-ascii

for en tar fil: application / x-tjære; charset = binær

for en BZ2 fil: application / x-bzip2-; charset = binær

og sist men ikke minst for meg en ZIP-fil: application / zip; charset = binær

Svarte 03/02/2015 kl. 19:09
kilden bruker

stemmer
6

Du har ikke staten hva webserveren du brukte, men Apache har en fin liten modul kalt Mime magi som den bruker til å finne ut hvilken type en fil når beskjed om å gjøre det. Den leser noen av filens innhold og prøver å finne ut hvilken type det er basert på karakterene funnet. Og som Dave Webb Nevnt den mimetyper Module henhold python vil fungere, forutsatt en forlengelse er hendig.

Alternativt, hvis du sitter på et UNIX boksen kan du bruke sys.popen('file -i ' + fileName, mode='r')til å ta tak i MIME-type. Windows bør ha en tilsvarende kommando, men jeg er usikker på hva det er.

Svarte 04/09/2008 kl. 12:22
kilden bruker

stemmer
4

I Python 3.x og webapp med url til filen som ikke kunne ha en forlengelse eller en falsk forlengelse. Du bør installere python-magi, ved hjelp

pip3 install python-magic

For Mac OS X, bør du også installere libmagic hjelp

brew install libmagic

kodebiten

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)

Alternativt kan du sette en størrelse i lese

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)
Svarte 06/09/2016 kl. 19:55
kilden bruker

stemmer
3

2017 Update

Du trenger ikke å gå til github, er det på PyPI under et annet navn:

pip3 install --user python-magic
# or:
sudo apt install python3-magic  # Ubuntu distro package

Koden kan forenkles i tillegg:

>>> import magic

>>> magic.from_file('/tmp/img_3304.jpg', mime=True)
'image/jpeg'
Svarte 15/10/2017 kl. 19:09
kilden bruker

stemmer
3

Den mimetyper modulen bare gjenkjenne en filtype basert på filtypen. Hvis du vil prøve å gjenopprette en fil type en fil uten etternavn, de mimetyper vil ikke fungerer.

Svarte 19/06/2012 kl. 12:51
kilden bruker

stemmer
1

Python-bindingene til libmagic

Alle de forskjellige svar på dette emnet er veldig forvirrende, så jeg håper å gi litt mer klarhet med denne oversikten over de ulike bindinger av libmagic. Tidligere mammadori ga et kort svar notering tilgjengelige alternativet.

libmagic

Ved fastsetting av filer mime-type, er førstevalget bare kalt fileog sin back-end kalles libmagic. (Se Prosjektets hjemmeside .) Prosjektet er utviklet i et privat cvs-depotet, men det er en skrivebeskyttet git speil på GitHub .

Nå er dette verktøyet, som du trenger hvis du ønsker å bruke noen av de libmagic bindinger med python, kommer allerede med sine egne Python-bindingene som kalles file-magic. Det er ikke mye egen dokumentasjon for dem, men du kan alltid ta en titt på mannen siden av c-bibliotek: man libmagic. Den grunnleggende bruk er beskrevet i readme-filen :

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)

Bortsett fra dette, kan du også bruke biblioteket ved å opprette et Magicobjekt med magic.open(flags)som vist i eksempel filen .

Både toivotuo og ewr2san bruke disse file-magicbindingene er inkludert i fileverktøyet. De feilaktig antar de bruker python-magicpakken. Dette synes å indikere at dersom begge fileog python-magicer installert, python-modul magicrefererer til den tidligere.

python-magi

Dette er biblioteket som Simon Zimmermann snakker om i sitt svar , og som også er ansatt av Claude Coulombe samt Gringo Suave .

filemagic

Merk : Dette prosjektet ble sist oppdatert i 2013!

På grunn av å være basert på det samme C-api, har dette bibliotek noen likheter med file-magicinngår i libmagic. Det er bare nevnt av mammadori og ingen andre svar syssels det.

Svarte 22/06/2018 kl. 10:25
kilden bruker

stemmer
0

python 3 ref: https://docs.python.org/3.2/library/mimetypes.html

mimetypes.guess_type (url, streng = True) Gjett hvilken type en fil basert på filnavn eller URL, gitt av url. Returverdien er en tuppel (type koding) hvor typen er Ingen hvis den type som ikke kan gjettes (manglende eller gal suffiks) eller en streng av formen 'type / subtype', brukbare for et MIME-innhold typehodet.

koding er None for ingen koding eller navnet på det program som brukes til å kode (f.eks komprimere eller gzip). Kodingen er egnet for bruk som en Content-Encoding, ikke som en Content-Transfer-Encoding spissen. Tilordningene er tabellen drevet. Kodings suffikser og små bokstaver; typen suffikser blir først forsøkt tilfellet følsomt, så tilfelle insensitively.

Den valgfrie streng argumentet er et flagg som angir om en liste over kjente MIME-typer er begrenset til bare de offisielle typene registrert IANA. Når streng er sann (standard), blir bare IANA typene støttes; når streng er False, er noen flere som ikke er standard, men brukte MIME-typer også gjenkjent.

import mimetypes
print(mimetypes.guess_type("sample.html"))
Svarte 15/09/2019 kl. 08:05
kilden bruker

stemmer
0

Jeg prøver mimetyper bibliotek først. Hvis det ikke fungerer, jeg bruker python-magi biblioteket i stedet.

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
Svarte 22/05/2019 kl. 04:18
kilden bruker

stemmer
0

For byte Array typen data kan du bruke magic.from_buffer (_byte_array, mime = True)

Svarte 25/07/2018 kl. 04:43
kilden bruker

stemmer
0

Dette kan være gammel allerede, men hvorfor ikke bruke UploadedFile.content_type direkte fra Django? Er ikke det samme? ( Https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )

Svarte 31/10/2017 kl. 14:32
kilden bruker

stemmer
0

Jeg har prøvd mange eksempler, men med Django mutagen spiller pent.

Eksempel sjekke om filene er mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

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

Ulempen er at din evne til å kontrollere filtyper er begrenset, men det er en fin måte hvis du ikke vil bare se etter filtype, men også for å få tilgang til ytterligere informasjon.

Svarte 19/08/2017 kl. 10:33
kilden bruker

stemmer
-2

du kan bruke imghdr Python-modul.

Svarte 23/05/2012 kl. 04:37
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more