Πώς να βρείτε τον τύπο mime ενός αρχείου σε πύθωνα;

ψήφοι
133

Ας πούμε ότι θέλετε να αποθηκεύσετε μια δέσμη των αρχείων κάπου, για παράδειγμα σε BLOBs. Ας υποθέσουμε ότι θέλετε να πιάτο αυτά τα αρχεία έξω μέσω μιας ιστοσελίδας και να έχει ο πελάτης ανοίξει αυτόματα τη σωστή εφαρμογή / θεατή.

Υπόθεση: Το πρόγραμμα περιήγησης τα στοιχεία από ποια εφαρμογή / θεατή να χρησιμοποιήσει από το mime-τύπου (content-type;) κεφαλίδα στην απόκριση HTTP.

Με βάση αυτή την υπόθεση, εκτός από τα bytes του αρχείου, μπορείτε επίσης να αποθηκεύσετε τον τύπο MIME.

Πώς θα βρείτε τον τύπο MIME του αρχείου; Είμαι σήμερα σε Mac, αλλά αυτό θα πρέπει επίσης να λειτουργήσει στα Windows.

Μήπως το πρόγραμμα περιήγησης προσθέσετε αυτές τις πληροφορίες κατά τη δημοσίευση του αρχείου στην ιστοσελίδα;

Είναι μια τακτοποιημένη βιβλιοθήκη python για την εύρεση αυτών των πληροφοριών εκεί; Μια WebService ή (ακόμα καλύτερα) ένα downloadable βάση δεδομένων;

Δημοσιεύθηκε 04/09/2008 στις 11:07
πηγή χρήστη
Σε άλλες γλώσσες...                            


19 απαντήσεις

ψήφοι
68

Η μονάδα τύποι mime στην πρότυπη βιβλιοθήκη θα καθορίσει / μαντέψει τον τύπο MIME από μια επέκταση αρχείου.

Εάν οι χρήστες έχουν τη μεταφόρτωση αρχείων η θέση HTTP θα περιέχει τον τύπο MIME του αρχείου μαζί με τα δεδομένα. Για παράδειγμα, Django καθιστά αυτά τα δεδομένα διαθέσιμα ως ένα χαρακτηριστικό του UploadedFile αντικειμένου.

Απαντήθηκε 04/09/2008 στις 11:12
πηγή χρήστη

ψήφοι
6

Δεν έχετε δηλώσει τι του web server που χρησιμοποιούσατε, αλλά Apache έχει μια ωραία μικρή μονάδα που ονομάζεται Παντομίμας Magic που χρησιμοποιεί για να καθορίσει τον τύπο του αρχείου, όταν είπε να το πράξει. Διαβάζει μερικά από το περιεχόμενο του αρχείου και προσπαθεί να καταλάβω τι πληκτρολογείτε βασίζεται στους χαρακτήρες που βρέθηκαν. Και όπως ο Dave Webb ανέφερε ο τύποι mime Ενότητα κάτω python θα λειτουργήσει, εφόσον η παράταση είναι βολικό.

Εναλλακτικά, αν κάθεστε σε ένα κουτί UNIX μπορείτε να χρησιμοποιήσετε sys.popen('file -i ' + fileName, mode='r')για να αρπάξει τον τύπο MIME. Τα Windows θα πρέπει να έχει μια ισοδύναμη εντολή, αλλά είμαι σίγουρος για το τι είναι.

Απαντήθηκε 04/09/2008 στις 11:22
πηγή χρήστη

ψήφοι
8

σε python 2.6:

mime = subprocess.Popen("/usr/bin/file --mime PATH", shell=True, \
    stdout=subprocess.PIPE).communicate()[0]
Απαντήθηκε 02/11/2009 στις 14:48
πηγή χρήστη

ψήφοι
41

Πιο αξιόπιστος τρόπος από το να χρησιμοποιούν τη βιβλιοθήκη τύποι mime θα ήταν να χρησιμοποιήσετε το πακέτο python-μαγεία.

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

Αυτό θα ισοδυναμούσε με τη χρήση αρχείων (1).

Σε Django θα μπορούσε επίσης να βεβαιωθείτε ότι ο τύπος MIME ταιριάζει με αυτό του UploadedFile.content_type.

Απαντήθηκε 25/01/2010 στις 15:39
πηγή χρήστη

ψήφοι
157

Η python-μαγική μέθοδος που προτείνεται από toivotuo είναι ξεπερασμένη. Python-μαγεία της τρέχουσας κορμός είναι σε Github και με βάση το readme εκεί, βρίσκοντας τον τύπο MIME, γίνεται σαν αυτό.

# For MIME types
>>> import magic
>>> mime = magic.Magic(mime=True)
>>> mime.from_file("testdata/test.pdf")
'application/pdf'
>>>
Απαντήθηκε 02/05/2010 στις 11:02
πηγή χρήστη

ψήφοι
-2

μπορείτε να χρησιμοποιήσετε imghdr μονάδα Python.

Απαντήθηκε 23/05/2012 στις 03:37
πηγή χρήστη

ψήφοι
3

Η μονάδα τύποι mime αναγνωρίζουν μόνο έναν τύπο αρχείου με βάση την επέκταση αρχείου. Αν θα προσπαθήσει να ανακτήσει έναν τύπο αρχείου ενός αρχείου χωρίς επέκταση, οι τύποι mime δεν θα λειτουργεί.

Απαντήθηκε 19/06/2012 στις 11:51
πηγή χρήστη

ψήφοι
9

Υπάρχουν 3 διαφορετικές βιβλιοθήκες που αναδιπλώνεται libmagic.

2 από αυτά είναι διαθέσιμα σε pypi (έτσι pip εγκατάσταση θα λειτουργήσει):

  • filemagic
  • python-μαγεία

Και ένα άλλο, παρόμοιο με το python-μαγεία είναι διαθέσιμο άμεσα στις τελευταίες libmagic πηγές, και είναι αυτή που έχει κατά πάσα πιθανότητα στη διανομή linux σας.

Σε Debian το πακέτο python-magic είναι για αυτό το ένα και χρησιμοποιείται ως toivotuo είπε και δεν ξεπερασμένων όπως είπε Simon Zimmermann (IMHO).

Μου φαίνεται μια άλλη ανάληψη (από τον αρχικό συντάκτη του libmagic).

Κρίμα δεν είναι διαθέσιμο άμεσα σε pypi.

Απαντήθηκε 06/09/2012 στις 09:22
πηγή χρήστη

ψήφοι
21

Αυτό φαίνεται να είναι πολύ εύκολο

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

Απαντήθηκε 13/02/2014 στις 11:09
πηγή χρήστη

ψήφοι
5

μέθοδος @toivotuo «s λειτούργησε καλύτερα και πιο αξιόπιστα για μένα κάτω python3. Ο στόχος μου ήταν να προσδιορίσει συμπιεσμένα αρχεία που δεν έχουν ένα αξιόπιστο επέκταση .gz. Έχω εγκαταστήσει python3-μαγεία.

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

για ένα αρχείο gzipped επιστρέφει: application / gzip? charset = δυαδικό

για αποσυμπίεση του αρχείου txt (iostat δεδομένων): text / plain? charset = us-ascii

για ένα αρχείο tar: application / x-πίσσας? charset = δυαδικό

για ένα αρχείο bz2: application / x-bzip2? charset = δυαδικό

και τελευταίο αλλά όχι λιγότερο σημαντικό για μένα ένα αρχείο .zip: application / zip? charset = δυαδικό

Απαντήθηκε 03/02/2015 στις 17:09
πηγή χρήστη

ψήφοι
4

Στην Python 3.x και webapp με url για το αρχείο το οποίο δεν θα μπορούσε να έχει μια επέκταση ή ένα ψεύτικο επέκταση. Θα πρέπει να εγκαταστήσετε το python-μαγεία, χρησιμοποιώντας

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)
Απαντήθηκε 06/09/2016 στις 18:55
πηγή χρήστη

ψήφοι
0

Έχω δοκιμάσει πολλά παραδείγματα, αλλά με Django μεταλλαξιογόνο παίζει καλά.

Παράδειγμα ελέγχοντας αν τα αρχεία είναι mp3

from mutagen.mp3 import MP3, HeaderNotFoundError  

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

Το μειονέκτημα είναι ότι η ικανότητά σας να ελέγξετε τους τύπους αρχείων είναι περιορισμένη, αλλά είναι ένας πολύ καλός τρόπος, αν δεν θέλετε μόνο να ελέγξετε για τον τύπο αρχείου, αλλά και για να αποκτήσετε πρόσβαση σε πρόσθετες πληροφορίες.

Απαντήθηκε 19/08/2017 στις 09:33
πηγή χρήστη

ψήφοι
2

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'
Απαντήθηκε 15/10/2017 στις 18:09
πηγή χρήστη

ψήφοι
0

Αυτό μπορεί να είναι παλιά ήδη, αλλά γιατί να μην χρησιμοποιούν UploadedFile.content_type απευθείας από Django; Δεν είναι το ίδιο; ( https://docs.djangoproject.com/en/1.11/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type )

Απαντήθηκε 31/10/2017 στις 12:32
πηγή χρήστη

ψήφοι
1

της Python σε libmagic

Όλες οι διαφορετικές απαντήσεις σε αυτό το θέμα είναι πολύ συγκεχυμένη, έτσι είμαι ελπίζοντας να δώσει λίγο περισσότερη σαφήνεια με την επισκόπηση των διαφόρων συνδέσεις των libmagic. Προηγουμένως mammadori έδωσε μια σύντομη απάντηση λίστα το διαθέσιμη επιλογή.

libmagic

Κατά τον καθορισμό μιας αρχεία mime-type, το εργαλείο της επιλογής είναι απλά ονομάζεται fileκαι back-end του λέγεται libmagic. (Δείτε την αρχική σελίδα του έργου .) Το έργο αναπτύσσεται σε μια ιδιωτική CVS-αποθήκη, αλλά υπάρχει μόνο για ανάγνωση git καθρέφτη στο GitHub .

Τώρα αυτό το εργαλείο, το οποίο θα χρειαστείτε αν θέλετε να χρησιμοποιήσετε κάποιο από τα libmagic συνδέσεις με πύθωνα, έρχεται ήδη με το δικό του python που ονομάζεται file-magic. Δεν υπάρχει μεγάλη ειδική τεκμηρίωση για αυτούς, αλλά μπορείτε πάντα να ρίξετε μια ματιά στη σελίδα man του c-βιβλιοθήκη: 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έχουν εγκατασταθεί, η μονάδα python magicαναφέρεται στην πρώην μία.

python-μαγεία

Αυτή είναι η βιβλιοθήκη που Simon Zimmermann μιλά για το απάντησή του και η οποία χρησιμοποιείται επίσης από τον Claude Coulombe καθώς και Gringo Suave .

filemagic

Σημείωση : Το έργο αυτό ενημερώθηκε για τελευταία φορά το 2013!

Λόγω του ότι βασίζονται στο ίδιο γ-api, ότι αυτή η βιβλιοθήκη έχει κάποια ομοιότητα με το file-magicπου περιλαμβάνονται στο libmagic. Αναφέρεται μόνο από mammadori και καμία άλλη απάντηση που απασχολεί.

Απαντήθηκε 22/06/2018 στις 09:25
πηγή χρήστη

ψήφοι
0

Για τα δεδομένα byte τύπο Array μπορείτε να χρησιμοποιήσετε magic.from_buffer (_byte_array, μίμος = True)

Απαντήθηκε 25/07/2018 στις 03:43
πηγή χρήστη

ψήφοι
0

Προσπαθώ τύποι mime βιβλιοθήκη πρώτο. Αν δεν λειτουργεί, μπορώ να χρησιμοποιήσω python-μαγεία 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
Απαντήθηκε 22/05/2019 στις 03:18
πηγή χρήστη

ψήφοι
0

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

mimetypes.guess_type (url, αυστηρή = True) Μαντέψτε το είδος ενός αρχείου με βάση το όνομα αρχείου ή το URL του, δίνεται από τη διεύθυνση URL. Η τιμή που επιστρέφεται είναι μια πλειάδα (τύπος, που κωδικοποιεί), όπου ο τύπος είναι Κανένα, αν ο τύπος δεν μπορεί να μαντέψει (λείπει ή άγνωστη κατάληξη) ή μια συμβολοσειρά της μορφής «τύπου / υποτύπου», χρησιμοποιήσιμα για μια κεφαλίδα MIME τύπου περιεχομένου.

κωδικοποίηση είναι Κανένας χωρίς κωδικοποίηση ή το όνομα του προγράμματος που χρησιμοποιείται για την κωδικοποίηση (π.χ. τη συμπίεση ή gzip). Η κωδικοποίηση είναι κατάλληλο για χρήση ως κεφαλίδα Content-Encoding, όχι ως κεφαλίδα Content-Transfer-Encoding. Οι αντιστοιχίσεις είναι πίνακας οδηγείται. καταλήξεις Κωδικοποίηση είναι ευαίσθητη υπόθεση? επιθήματα τύπου πρώτα προσπάθησαν περίπτωση με ευαισθησία, στη συνέχεια, περίπτωση insensitively.

Το προαιρετικό αυστηρή επιχείρημα είναι μια σημαία που καθορίζει εάν η λίστα των γνωστών τύπων MIME περιορίζεται μόνο στις επίσημες τύπους εγγραφεί IANA. Όταν αυστηρή είναι True (η προεπιλογή), μόνο οι τύποι IANA που υποστηρίζονται? όταν αυστηρή είναι False, μερικές επιπλέον μη-τυπική, αλλά συνήθως χρησιμοποιούνται οι τύποι MIME αναγνωρίζονται επίσης.

import mimetypes
print(mimetypes.guess_type("sample.html"))
Απαντήθηκε 15/09/2019 στις 07:05
πηγή χρήστη

ψήφοι
0

Δεν θα μπορούσε να προσθέσει ένα σχόλιο, είμαι νέος.

Χρησιμοποιώ:

import magic
mime = magic.Magic(mime=True)
mime.from_file("mypath/myfile.mkv")

που λειτουργεί εκτός από αρχεία βίντεο πάνω από 2 GB, όπου αναφέρει «inode / blockdevice». MediaInfo μου δίνει την κανονική πληροφορίες σχετικά με τα αρχεία. Τα βίντεο παίζουν επίσης στηρίχθηκε στον vlc.

Δεν είστε σίγουροι τι προκαλεί αυτό.

Τα Windows 10 pro v1903 x64, python 3.7.4

Απαντήθηκε 20/12/2019 στις 18:52
πηγή χρήστη

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