从python中的.eml文件解析excel附件

Posted

技术标签:

【中文标题】从python中的.eml文件解析excel附件【英文标题】:Parse excel attachment from .eml file in python 【发布时间】:2019-06-02 07:44:33 【问题描述】:

我正在尝试解析 .eml 文件。 .eml 有一个 Excel 附件,该附件当前采用 base 64 编码。我正在尝试弄清楚如何将其解码为 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

问题是

当我尝试对其进行解码时,它会吐出一些看起来像这样的东西。

我使用这篇文章来帮助我编写上面的代码。

How can I get an email message's text content using 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 仍然返回编码的附件。我在上面包含了一个更新的 sn-p,以防我做错了什么 看起来很好分开MyDoc.doc,应该类似于Openworkorders.odsOpenworkorders.xlsx。尝试使用 Excel 或 OpenOffice 打开保存的文件。 “我可以看到内容很好”。您已成功从.eml 中提取.xlsx“将其解析为 CSV”:简单的解决方案是将其从 Excel 保存到 CSV。如果你想使用 Python 来实现,请使用 Working with Excel Files in Python 上显示的包 相关xls-to-csv-converter “如何在 Excel 中打开对我有帮助”eml => f.write(part.get_payload( => *.xlsx => 使用 Excel 打开 == 已验证。 这行得通吗? 【参考方案1】:

从this table 可以清楚地看出(并且您已经得出结论),此文件是.xlsx。你不能只用unicodebase64 解码它:你需要一个特殊的包。 Excel 文件特别复杂(例如,this one 处理 PowerPoint 和 Word,但不是 Excel)。网上有几个,见here - xlrd 可能是最好的。

【讨论】:

我应该按照自述文件的指示安装全文吗?另外,我具体应该如何处理该扩展程序? application/vnd.ms-excel 感谢您的回复,您绝对是对的,但是由于您的回答有点笼统,我稍后会发布我的解决方案。 太棒了!是的,我不确定所有细节,您绝对应该继续发布您的解决方案【参考方案2】:

这是我的解决方案:

我发现了 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))

【讨论】:

以上是关于从python中的.eml文件解析excel附件的主要内容,如果未能解决你的问题,请参考以下文章

如何解析带有附件和内联图像的 EML 文件并转换为 HTML

Python - 从电子邮件附件下载 excel 文件然后解析它

如何在 php 中解析 .eml 文件?

将 MimeMessage 对象消息转发为 EML 文件中附件的常规转发格式

使用 javamail 解析 eps 附件

如何用Java解析.eml文件