Як перетворити змінну байтового рядка Python 3 в звичайну рядок?


116

Я прочитав у XML-вкладеному файлі з

bytes_string=part.get_payload(decode=False)

Корисне навантаження надходить як байт-рядок, як підказує моя назва змінної.

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

Приклад показує:

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

Як я можу застосувати bаргумент ключового слова (байти) до моєї змінної bytes_stringта використовувати рекомендований підхід?

Те, як я спробував, не працює:

str(bbytes_string, 'utf-8')

Відповіді:


210

У вас це було майже прямо в останньому рядку. Ти хочеш

str(bytes_string, 'utf-8')

тому що тип bytes_stringє bytes, такий же, як і тип b'abc'.


6
str(bytes_string, 'utf-8', 'ignore')Помилки можна ігнорувати, передаючи третій параметр.
Шубхамой

2
Це виглядає так, що це має бути коментарем до відповіді pylang (який адресує обробку недійсних даних). Якщо (ви вважаєте, що) немає нічого поганого bytes_string, чому б ви хотіли ігнорувати помилки?
Toby Speight

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, і що ви очікували?
Toby Speight

Дякую за рішення
Аджай Кумар

49

Зателефонуйте decode()на bytesекземпляр, щоб отримати текст, який він кодує.

str = bytes.decode()

5
UnicodeDecodeError: кодек "utf-8" не може розшифрувати байт 0xf6 на позиції 230: недійсний стартовий байт
Juha Untinen

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, ласкаво просимо. Радий, що можу допомогти.
Сейфі

6

Як відфільтрувати (пропустити) символи, що не належать до UTF8, з масиву?

Щоб вирішити цей коментар у публікації @ uname01 та ОП, ігноруйте помилки:

Код

>>> 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.