Подтвердить что ты не робот

Как преобразовать между байтами и строками в Python 3?

Это вопрос типа Python 101, но он некоторое время меня озадачил, когда я попытался использовать пакет, который, казалось, преобразовал мой ввод строки в байты.

Как вы увидите ниже, я нашел ответ для себя, но я чувствовал, что стоит записывать здесь, потому что мне потребовалось время, чтобы раскопать то, что происходит. Это похоже на Python 3, поэтому я не ссылался на исходный пакет, с которым я играл; это не кажется ошибкой (просто, что конкретный пакет имел метод .tostring(), который явно не создавал то, что я понимал как строку...)

Моя тестовая программа выглядит следующим образом:

import mangler                                 # spoof package

stringThing = """
<Doc>
    <Greeting>Hello World</Greeting>
    <Greeting>你好</Greeting>
</Doc>
"""

# print out the input
print('This is the string input:')
print(stringThing)

# now make the string into bytes
bytesThing = mangler.tostring(stringThing)    # pseudo-code again

# now print it out
print('\nThis is the bytes output:')
print(bytesThing)

Результат этого кода дает следующее:

This is the string input:

<Doc>
    <Greeting>Hello World</Greeting>
    <Greeting>你好</Greeting>
</Doc>


This is the bytes output:
b'\n<Doc>\n    <Greeting>Hello World</Greeting>\n    <Greeting>\xe4\xbd\xa0\xe5\xa5\xbd</Greeting>\n</Doc>\n'

Таким образом, необходимо иметь возможность конвертировать между байтами и строками, чтобы не допустить, чтобы символы не-ascii превращались в gobbledegook.

4b9b3361

Ответ 1

"mangler" в приведенном выше примере кода делал эквивалент этого:

bytesThing = stringThing.encode(encoding='UTF-8')

Есть и другие способы написать это (особенно используя bytes(stringThing, encoding='UTF-8'), но приведенный выше синтаксис делает очевидным, что происходит, а также что нужно сделать, чтобы восстановить строку:

newStringThing = bytesThing.decode(encoding='UTF-8')

Когда мы делаем это, восстанавливается исходная строка.

Примечание. Использование str(bytesThing) просто расшифровывает все gobbledegook без преобразования его обратно в Unicode, если вы специально не запрашиваете UTF-8, а именно, str(bytesThing, encoding='UTF-8'). Не сообщается об ошибке, если кодировка не указана.

Ответ 2

В python3 существует метод bytes(), который находится в том же формате, что и encode().

str1 = b'hello world'
str2 = bytes("hello world", encoding="UTF-8")
print(str1 == str2) # Returns True

Я ничего не читал об этом в документах, но, возможно, я не искал нужного места. Таким образом, вы можете явно перевернуть строки в потоки байтов и сделать их более читабельными, чем использование encode и decode, и без предварительного предпросмотра b перед кавычками.

Ответ 3

ПОПРОБУЙТЕ ЭТО:

StringVariable=ByteVariable.decode('UTF-8','ignore')

ТИП ИСПЫТАНИЯ:

print(type(StringVariable))

Здесь 'StringVariable' представлен как строка. "ByteVariable" представляют собой байты. Его не релевантно задавать переменные..