Python 3.6 Mbox 转 CSV
Python 3.6 Mbox to CSV
我正在尝试编写一个脚本,将 .mbox
文件的每个电子邮件元素转换为 .csv
文件。我特别需要以下元素,但如果有办法 "write for each element," 那将是首选:
收件人、发件人、抄送、密件抄送、日期、主题、正文
我在网上找到了一个脚本,看起来是我需要的开始,documentation 关于电子邮件模块,但我找不到关于如何
的任何细节
- 识别不同的属性选项(
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 header.
接下来您需要使用 .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 编写器。当某些消息不包含所有可能的 header 值时,这会更好地应对。
消息负载可以分为多个部分,这些部分作为单独的列添加 header,例如Part01
、Part02
。通常应该有 1 或 2 个,但您的示例 mbox 包含一个带有奇怪签名的 25?
如果 mbox
包含消息的更多负载条目(即 >30),则使用 extrasaction='ignore'
将忽略这些条目。另一种方法是将所有有效负载合并到一个列中。
我正在尝试编写一个脚本,将 .mbox
文件的每个电子邮件元素转换为 .csv
文件。我特别需要以下元素,但如果有办法 "write for each element," 那将是首选:
收件人、发件人、抄送、密件抄送、日期、主题、正文
我在网上找到了一个脚本,看起来是我需要的开始,documentation 关于电子邮件模块,但我找不到关于如何
的任何细节- 识别不同的属性选项(
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 header.
接下来您需要使用 .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 编写器。当某些消息不包含所有可能的 header 值时,这会更好地应对。
消息负载可以分为多个部分,这些部分作为单独的列添加 header,例如Part01
、Part02
。通常应该有 1 或 2 个,但您的示例 mbox 包含一个带有奇怪签名的 25?
如果 mbox
包含消息的更多负载条目(即 >30),则使用 extrasaction='ignore'
将忽略这些条目。另一种方法是将所有有效负载合并到一个列中。