Python 3.6 Mbox для CSV - PullRequest
       35

Python 3.6 Mbox для CSV

0 голосов
/ 06 июня 2018

Я пытаюсь написать скрипт, который преобразует каждый элемент электронной почты файла .mbox в файл .csv.Мне особенно нужны следующие элементы, но если бы был способ «написать для каждого элемента», это было бы предпочтительным:

Кому, От, CC'd, BCC'd, Дата, Тема, Тело

Я нашел в Интернете скрипт, который выглядит как начало того, что мне нужно, и документацию о модуле электронной почты, но я не могу найти какие-либо подробности о том, как

  1. идентифицирует различные параметры атрибута (to, from, cc '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']])

1 Ответ

0 голосов
/ 20 июня 2018

Для этого вам сначала необходимо определить полный список возможных ключей, присутствующих во всех элементах почтового ящика.Затем вы можете использовать это для записи заголовка 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?

...