Извлечение содержимого из файла с MIME multipart - PullRequest
3 голосов
/ 09 октября 2010

У меня есть файл, содержащий изображение TIFF и документ XML в документе MIME из нескольких частей.Я хотел бы извлечь изображение из этого файла.Как я могу получить его?

У меня есть этот код, но для его извлечения требуется бесконечное время, если у меня большой файл (например, 30 МБ), поэтому это не полезно.

Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 09 октября 2010

Решено:

def extract_mime_part_matching(stream, mimetype):
"""Return the first element in a multipart MIME message on stream
matching mimetype."""

msg = mimetools.Message(stream)
msgtype = msg.gettype()
params = msg.getplist()

data = StringIO.StringIO()
if msgtype[:10] == "multipart/":

    file = multifile.MultiFile(stream)
    file.push(msg.getparam("boundary"))
    while file.next():
        submsg = mimetools.Message(file)
        try:
            data = StringIO.StringIO()
            mimetools.decode(file, data, submsg.getencoding())
        except ValueError:
            continue
        if submsg.gettype() == mimetype:
            break
    file.pop()
return data.getvalue()

От: http://docs.python.org/release/2.6.6/library/multifile.html

Спасибо за поддержку.

0 голосов
/ 09 октября 2010

Мне не совсем понятно, почему ваш код зависает. Отступ выглядит немного неверно, а открытые файлы не закрываются должным образом. Возможно, у вас недостаточно памяти.

Эта версия отлично работает для меня:

import email
import mimetypes

with open('email.txt') as fp:
    message = email.message_from_file(fp)

for i, part in enumerate(message.walk()):
    if part.get_content_maintype() == 'image':
        filename = part.get_filename()
        if not filename:
            ext = mimetypes.guess_extension(part.get_content_type())
            filename = 'image-%02d%s' % (i, ext or '.tiff')
        with open(filename, 'wb') as fp:
            fp.write(part.get_payload(decode=True))

(частично взято из http://docs.python.org/library/email-examples.html#email-examples)

...