在Python中解析.eml文件中的Excel附件

4
我正在尝试解析一个.eml文件。该文件包含一个当前为base 64编码的Excel附件。我正在努力弄清如何将其解码为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")

嗨@stovfl,我已经尝试过了,但part.get_payload仍然返回编码的附件。如果我做错了什么,我已经在上面包含了更新的片段。 - Melody Anoni
看起来不错,除了 MyDoc.doc,应该使用类似于 Openworkorders.odsOpenworkorders.xlsx 的文件。尝试使用 Excel 或 OpenOffice 打开保存的文件。 - stovfl
1
我可以正常看到内容。你已经成功从.eml中提取了.xlsx文件。将其解析为CSV格式:最简单的解决方案是将其从Excel保存为CSV格式。如果您想使用Python进行操作,请使用在Python中处理Excel文件中展示的一个包。 - stovfl
1
相关的 xls-to-csv-converter - stovfl
1
“如何在Excel中打开会对我有所帮助”,eml => f.write(part.get_payload( => *.xlsx => 用Excel打开 == 已验证。这个可行吗? - stovfl
显示剩余3条评论
2个回答

2

这个表格中可以清楚地看出(正如你已经得出的结论),这个文件是一个.xlsx文件。你不能只用unicodebase64对其进行解码:你需要一个特殊的包。特别是Excel文件有点棘手(例如,这个可以处理PowerPoint和Word,但不支持Excel)。有一些在线工具,在这里查看 - xlrd可能是最好的选择。


那我是否应该按照README的指示安装FullText呢?另外,我具体应该如何使用这个扩展名application/vnd.ms-excel - Melody Anoni
1
谢谢您的回复,您的确是正确的,但因为您的答案有些笼统,我稍后会发布我的解决方案。 - Melody Anoni
太好了!是啊,我不确定所有的细节,你应该继续发布你的解决方案。 - Josh Friedlander

0

这是我的解决方案:

我发现了两件事情:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接