【问题标题】:Python 3.6 Mbox to CSVPython 3.6 Mbox 转 CSV
【发布时间】:2018-11-15 12:26:05
【问题描述】:

我正在尝试编写一个脚本,将.mbox 文件的每个电子邮件元素转换为.csv 文件。我特别需要以下元素,但如果有一种方法可以“为每个元素编写”,那将是首选:

收件人、发件人、抄送、密件抄送、日期、主题、正文

我在网上找到了一个看起来是我需要的脚本的开始,以及关于电子邮件模块的documentation,但我找不到任何关于如何做的细节

  1. 确定不同的属性选项(tofromcc'd 等)
  2. 如何将它们写为.csv 中的唯一单元格值。

这是我找到的示例代码:

import mailbox
import csv

writer = csv.writer(open("clean_mail_B.csv", "wb"))
for message in mailbox.mbox('Saks.mbox'):
    writer.writerow([message['to'], message['from'], message['date']])

【问题讨论】:

  • 在您的循环中添加print(message),然后您将看到哪些项目可用。
  • 太棒了。我一直在试图弄清楚如何做这么简单的事情。我是python新手,所以请原谅无知,哈哈。会尽快尝试
  • @MartinEvans - 所以我这样做了,它确实打印了消息,但它非常混乱。它并没有真正列出可用的属性,而是文件的实际内容。不确定这是否是您的想法,但对我来说还是有点陌生​​。
  • 它将以 Python 字典的形式显示所有可用的信息。即它通过将单词(或键)与定义(或值)相关联来工作。只查看哪些键可用,例如tofrom,使用 print(message.keys())
  • 谢谢@MartinEvans。这很有意义。我会试试看。

标签: python csv email mbox


【解决方案1】:

为此,您首先需要确定所有邮箱项目中可能存在的密钥的完整列表。然后您可以使用它来编写 CSV 标头。

接下来,您需要使用.items() 从每条消息中获取所有键值对。然后可以将其转换回字典并写入您的 CSV 文件。

不幸的是,mailbox 库没有直接公开消息字典,否则可以直接编写它。

import mailbox
import csv

mbox_file = 'sample.mbox'

with open('clean_mail_B.csv', 'w', newline='', encoding='utf-8') as f_output:
    # Create a column for the first 30 message payload sections
    fieldnames = {f'Part{part:02}' for part in range(1, 31)}

    for message in mailbox.mbox(mbox_file):
        fieldnames.update(message.keys())

    csv_output = csv.DictWriter(f_output, fieldnames=sorted(fieldnames), restval='', extrasaction='ignore')
    csv_output.writeheader()

    for message in mailbox.mbox(mbox_file):
        items = dict(message.items())

        for part, payload in enumerate(message.get_payload(), start=1):
            items[f'Part{part:02}'] = payload

        csv_output.writerow(items)

使用DictWriter 而不是标准的 CSV 写入器。当某些消息不包含所有可能的标头值时,这将更好地处理。

消息负载可以分为多个部分,这些部分作为单独的列标题添加,例如Part01Part02。通常应该有 1 或 2 个,但您的示例 mbox 包含一个带有奇怪签名的 25?

如果mbox 包含更多消息的有效负载条目(即>30),则使用extrasaction='ignore' 忽略这些条目。另一种方法是将所有有效负载组合到一个列中。

【讨论】:

  • 嘿,非常感谢你。我在工作中被另一个项目搁置了,但这又回到了我的盘子上。除了一个例外,这完美地工作。显然,没有一个键对应于实际消息。我可以在 .mbox 文件中看到手动读取的消息,但我需要它是 .csv 文件的列之一。有什么想法吗?
  • 您可以使用 pastebin 之类的工具将链接粘贴到示例 mbox 文件吗?然后我可以看看它。
  • 我正在寻找一个。我有一些,但他们在细节中有工作信息,所以我宁愿找到更中性的东西。
  • 您可以使用get_payload() 获取消息内容,然后将其作为另一个键添加到要写入的字典中。我已经更新了脚本以展示如何做到这一点。
猜你喜欢
  • 2014-01-28
  • 2019-08-20
  • 2012-10-11
  • 1970-01-01
  • 2011-01-30
  • 2018-05-29
  • 1970-01-01
  • 2018-02-01
  • 2023-04-03
相关资源
最近更新 更多