Элемент последовательности TypeError 0: ожидаемый экземпляр str, найдены байты - PullRequest
0 голосов
/ 17 мая 2019

по какой-то причине я продолжаю получать ошибку TypeError в этом

Traceback TypeError (последний последний вызов) <</p>

ipython-input-19-3490eb36442d> in <module>
      2 result, numbers = mail.uid('search', None, "ALL")
      3 uids = numbers[0].split()
----> 4 result, messages = mail.uid('fetch', ','.join(uids), '(BODY[])')

mail.select("INBOX")
result, numbers = mail.uid('search', None, "ALL")
uids = numbers[0].split()
result, messages = mail.uid('fetch', ','.join(uids), '(BODY[])')
date_list = []
from_list = []
message_text = []
for _, message in messages[::2]:
    msg = email.message_from_string(message)
    if msg.is_multipart():
        t = []
    for p in msg.get_payload():
        t.append(p.get_payload(decode=True))
        message_text.append(t[0])

    else:message_text.append(msg.get_payload(decode=True))
    date_list.append(msg.get('date'))
    from_list.append(msg.get('from'))
    date_list = pd.to_datetime(date_list)
    print (len(message_text))
    print (len(from_list))
    df = pd.DataFrame(data={'Date':date_list,'Sender':from_list,'Message':message_text})
    print (df.head())
    df.to_csv('~inbox_email.csv',index=False)

1 Ответ

0 голосов
/ 17 мая 2019

Эта строка

result, messages = mail.uid('fetch', ','.join(uids), '(BODY[])')

поднимает исключение

Элемент последовательности TypeError 0: ожидаемый экземпляр str, найдено байтов

При проверке строки, 'fetch' и '(BODY[])' уже являются строками, поэтому они вряд ли будут проблемой.

Это оставляет ','.join(uids). uids на самом деле представляет собой список байтов экземпляров, поэтому str.join вызывает исключение, поскольку ожидает итерацию из str экземпляров.

Чтобы устранить проблему, декодируйте numbers[0] до str, прежде чем манипулировать ею.

result, numbers = mail.uid('search', None, "ALL")
uids = numbers[0].decode().split()    # <- decode before splitting
result, messages = mail.uid('fetch', ','.join(uids), '(BODY[])')
...