2010-10-08 20 views
2

J'ai un fichier qui contient une image tiff et un document xml dans un document mime en plusieurs parties. Je voudrais extraire l'image de ce fichier. Comment je peux l'obtenir?Extraire le contenu d'un fichier avec mime multipart

J'ai ce code, mais il faut un temps infini pour l'extraire, si j'ai un gros fichier (par exemple 30Mb), donc c'est inutile.

f=open("content_file.txt","rb") 
msg = email.message_from_file(f) 
j=0 
image=False 
for i in msg.walk(): 
    if i.is_multipart(): 
     #print "MULTIPART: " 
     continue 
    if i.get_content_maintype() == 'text': 
     j=j+1 
     continue 
    if i.get_content_maintype() == 'image': 
     image=True 
     j=j+1 
     pl = i.get_payload(decode=True) 
     localFile = open("map.out.tiff", 'wb') 
     localFile.write(pl) 
     continue 
     f.close() 
    if (image==False): 
     sys.exit(0); 

Merci beaucoup.

Répondre

4

Résolu:

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

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

Merci pour le soutien .

0

Ce n'est pas très clair pour moi, pourquoi votre code se bloque. L'indentation semble un peu erronée et les fichiers ouverts ne sont pas correctement fermés. Vous pouvez également avoir peu de mémoire.

Cette version fonctionne bien pour moi:

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

(en partie pris de http://docs.python.org/library/email-examples.html#email-examples)

+0

Cela fonctionne bien pour les petits fichiers ... mais je dois gérer de gros fichiers (par exemple 30mb), et ça ne marche pas bien. Cela prend beaucoup de temps et le processeur est toujours chargé. – michele

+0

Des suggestions? Merci. – michele