python - Python 3.6 Mbox 转 CSV
问题描述
我正在尝试编写一个脚本,将文件的每个电子邮件元素.mbox
转换为.csv
文件。我特别需要以下元素,但如果有一种方法可以“为每个元素编写”,那将是首选:
收件人、发件人、抄送、密件抄送、日期、主题、正文
我在网上找到了一个看起来是我需要的开始的脚本,以及关于电子邮件模块的文档,但我找不到任何关于如何使用的细节
- 识别不同的属性选项(
to
,from
,cc
'd 等) - 如何将它们写为
.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']])
解决方案
为此,您首先需要确定所有邮箱项目中可能存在的密钥的完整列表。然后您可以使用它来编写 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)
使用ADictWriter
而不是标准的 CSV 写入器。当某些消息不包含所有可能的标头值时,这将更好地应对。
消息有效负载可以分为多个部分,这些部分作为单独的列标题添加,Part01
例如Part02
. 通常应该有 1 或 2,但您的示例 mbox 包含一个带有奇怪签名的 25?
如果mbox
消息包含更多有效负载条目(即>30),则使用 忽略这些条目extrasaction='ignore'
。另一种方法是将所有有效负载组合到一个列中。
推荐阅读
- javascript - 在 React / NextJS 中使用 cookie-react 解析 JSON cookie 时的奇怪行为
- javascript - 如何使用 CefSharp 访问 html 元素属性
- python - 计算机重启后从 Pycharm 恢复打印
- python - Google 通过国家/地区列将字符串列表翻译成检测到的语言,并通过将每个字符串连接到关键字列来创建新列
- python - PyTorch - 逐元素签名的最小值/最大值?
- json - serializerByType 和 deserializerByType 不起作用
- django - 部署到 Google Cloud Run 后未显示静态文件
- python - 使用 python 列出多个 Active Directory 中的所有组
- elasticsearch - ElasticSearch Scroll API 如何在内部工作
- twitter-bootstrap - 我们如何将 Bootstrap 4 添加到 Sapper 应用程序中?