Разбор вложений Excel из файла .eml в python - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь разобрать файл .eml. .Eml имеет вложение Excel, которое в настоящее время кодируется в формате base64. Я пытаюсь понять, как декодировать его в XML, чтобы потом я мог превратить его в CSV, с которым я могу что-то делать.

Это мой код прямо сейчас:

import email

data = file('Openworkorders.eml').read()
msg = email.message_from_string(data)

for part in msg.walk():
    c_type = part.get_content_type()
    c_disp = part.get('Content Disposition')


    if part.get_content_type() == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
        excelContents = part.get_payload(decode = True)

        print excelContents

Проблема

Когда я пытаюсь его расшифровать, он выдает что-то похожее на это.

enter image description here

Я использовал этот пост, чтобы помочь мне написать код выше.

Как получить текстовое сообщение электронной почты с помощью Python?

Обновление:

Это в точности соответствует решению поста с моим файлом, но part.get_payload() возвращает все, что все еще закодировано. Я не понял, как получить доступ к декодированному контенту таким образом.

import email


data = file('Openworkorders.eml').read()
msg = email.message_from_string(data)
for part in msg.walk():
    if part.get_content_type() == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
        name = part.get_param('name') or 'MyDoc.doc'
        f = open(name, 'wb')
        f.write(part.get_payload(None, True)) 
        f.close()

        print part.get("content-transfer-encoding")

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вот мое решение:

Я нашел 2 вещи:

1.) Я думал, что .open () шел внутри .eml и изменял выбранные декодированные элементы. Я думал, что мне нужно увидеть декодированные данные, прежде чем двигаться вперед. Что действительно происходит с .open () - это создание нового файла в той же директории этого файла .xlsx. Вы должны открыть вложение, прежде чем сможете работать с данными. 2.) Вы должны открыть рабочую книгу xlrd с путем к файлу.

import email
import xlrd 

data = file('EmailFileName.eml').read()
    msg = email.message_from_string(data)  # entire message

    if msg.is_multipart():
        for payload in msg.get_payload():
            bdy = payload.get_payload()
    else:
        bdy = msg.get_payload()

    attachment = msg.get_payload()[1]


    # open and save excel file to disk
    f = open('excelFile.xlsx', 'wb')
    f.write(attachment.get_payload(decode=True))
    f.close()

    xls = xlrd.open_workbook(excelFilePath) # so something in quotes like '/Users/mymac/thisProjectsFolder/excelFileName.xlsx'

    # Here's a bonus for how to start accessing excel cells and rows
    for sheets in xls.sheets():
        list = []
        for rows in range(sheets.nrows):
            for col in range(sheets.ncols):
                list.append(str(sheets.cell(rows, col).value))
0 голосов
/ 07 января 2019

Как видно из этой таблицы (и, как вы уже сделали вывод), этот файл является .xlsx. Вы не можете просто расшифровать его с помощью unicode или base64: вам нужен специальный пакет. В частности, файлы Excel немного сложнее (например, , этот делает PowerPoint и Word, но не Excel). Есть несколько онлайн, см. здесь - xlrd может быть лучшим.

...