TypeError: требуется байтоподобный объект, не 'str', а тип показывает байты - PullRequest
0 голосов
/ 09 октября 2019

Вывод этого кода:

print(type(body))
body = body.replace('\n', '<br>')

производит:

<class 'bytes'>
TypeError: a bytes-like object is required, not 'str'

Почему происходит ошибка типа, когда тело является байтовым объектом?

У меня естьтакже протестировал replace() аргументы как b'\n', b'<br> , как предлагается в этом вопросе , но не повезло.

TypeError: replace() argument 1 must be str, not bytes

Вот полный фрагмент кода, для справки я пытаюсьотображать содержимое электронной почты в формате html на веб-странице:

def GetMimeMessage(service, user_id, msg_id):

  try:
    message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
    msg_bytes = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
    b = email.message_from_bytes(msg_bytes)
    body = ""

    if b.is_multipart():
      for part in b.walk():
        ctype = part.get_content_type()
        cdispo = str(part.get('Content-Disposition'))

    # skip any text/plain (txt) attachments
    if ctype == 'text/plain' and 'attachment' not in cdispo:
      body = part.get_payload(decode=True)  # decode
      break
    # not multipart - i.e. plain text, no attachments, keeping fingers crossed
    else:
      body = b.get_payload(decode=True)

    print(type(body))
    body = body.replace('\n', b'<br>')
    return body
  except errors.HttpError as error:
    print ('An error occurred: %s' % error)

1 Ответ

1 голос
/ 09 октября 2019

Измените это

body = body.replace('\n', b'<br>')

на это

body = body.decode()
body = body.replace('\n', '<br>')
  • Похоже, метод замены жалуется, потому что его байтовый объект. Пожалуйста, опубликуйте содержимое body, чтобы его можно было проверить.

  • Вот пример примера:

>>> s = b'asdf\nasdfa\n'
>>> s
b'asdf\nasdfa\n'
>>> s.replace('\n','<br>')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
>>> s.decode().replace('\n','<br>')
'asdf<br>asdfa<br>'
...