Как преобразовать переменную строки байтов Python 3 в обычную строку?


117

Я прочитал вложение электронной почты в формате XML с

bytes_string=part.get_payload(decode=False)

Полезные данные представлены в виде байтовой строки, как подсказывает имя моей переменной.

Я пытаюсь использовать рекомендуемый подход Python 3, чтобы превратить эту строку в пригодную для использования строку, которой я могу управлять.

Пример показывает:

str(b'abc','utf-8')

Как я могу применить bаргумент ключевого слова (bytes) к моей переменной bytes_stringи использовать рекомендуемый подход?

То, как я пробовал, не работает:

str(bbytes_string, 'utf-8')

Ответы:


210

У вас это было почти прямо в последней строке. Вы хотите

str(bytes_string, 'utf-8')

потому типа bytes_stringIS bytes, такой же , как тип b'abc'.


6
str(bytes_string, 'utf-8', 'ignore')Ошибки можно игнорировать, передав третий параметр.
Шубамой 08

2
Похоже, это должен быть комментарий к ответу pylang (который касается обработки недопустимого ввода). Если (вы полагаете, что) нет ничего плохого bytes_string, зачем вам игнорировать ошибки?
Тоби Спейт

3
Я получаю следующее сообщение об ошибке с вашим подходом: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byteза следующие байты строки b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
Alper

Что ж, @alper, это недопустимая строка UTF-8, чего вы ожидали?
Тоби Спейт

Спасибо за решение
Аджай Кумар

49

Вызов decode()на bytesэкземпляр , чтобы получить текст , который он кодирует.

str = bytes.decode()

5
UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0xf6 в позиции 230: недопустимый начальный байт
Юха Унтинен

3
@JuhaUntinen ваша кодировка, вероятно, не utf-8.
tommy.carstensen

4
Как отфильтровать (пропустить) символы, отличные от UTF8, из массива?
Доктор Файлов

9

ОБНОВЛЕНО:

ЧТОБЫ НЕ ИМЕТЬ НИКАКИХ bцитат в начале и в конце

Как преобразовать bytesв строки, даже в странных ситуациях.

Поскольку ваш код может содержать нераспознаваемые символы для 'utf-8'кодирования, лучше использовать просто str без каких-либо дополнительных параметров:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

если вы добавите 'utf-8'параметр к этим конкретным байтам, вы должны получить ошибку.

Как говорится в стандарте PYTHON 3, textтеперь без проблем будет в utf-8.


результат - «b '\\ x02 - \\ xdfI #)'», что, вероятно, не то, что он хочет,
Глен Томпсон

@GlenThompson - это просто пример нежелательных ситуаций, которые могут произойти. Я намеренно использую этот конкретный текст. Если вы имеете в виду, что bсначала в тексте есть текст , то я обновил ответ
Сейфи

так что большое спасибо, я ищу способ удалить b '' строки с символом ansi без кодирования и потери символов, я новичок в python и не знаю, чем я могу уменьшить массив с самого начала и начало использования индексов: O
Диего Фернандо Мурильо Валенси

@DiegoFernandoMurilloValenci, добро пожаловать. Рад, что могу помочь.
Seyfi

6

Как отфильтровать (пропустить) символы, отличные от UTF8, из массива?

Чтобы ответить на этот комментарий в сообщении @ uname01 и OP, игнорируйте ошибки:

Код

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

подробности

В документации приведены другие примеры использования того же errorsпараметра:

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

Аргумент ошибок определяет ответ, когда входная строка не может быть преобразована в соответствии с правилами кодирования. Допустимые значения для этого аргумента: 'strict'(вызвать UnicodeDecodeErrorисключение), 'replace'(использовать U+FFFD, REPLACEMENT CHARACTER) или 'ignore'(просто исключить символ из результата Unicode).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.