Для этого вам сначала необходимо определить полный список возможных ключей, присутствующих во всех элементах почтового ящика.Затем вы можете использовать это для записи заголовка 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:
# First determine the complete list of possible keys
fieldnames = {'Part{:02}'.format(part) 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='')
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['Part{:02}'.format(part)] = payload
csv_output.writerow(items)
A DictWriter
используется вместо стандартного устройства записи CSV.Тогда это будет лучше работать, когда определенное сообщение не будет содержать все возможные значения заголовка.
Полезная нагрузка сообщения может состоять из нескольких частей, они добавляются как отдельные заголовки столбцов, например, Part01
, Part02
.Обычно это должно быть 1 или 2, но ваш пример mbox содержал один со странной подписью, содержащий 25?