为此,您首先需要确定所有邮箱项目中可能存在的密钥的完整列表。然后您可以使用它来编写 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'
。另一种方法是将所有有效负载组合到一个列中。