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


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

.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>xe4xbdxa0xe5xa5xbd</Greeting>n</Doc>n'

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

4 62

4 ответа:

"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'). Если кодировка не указана, об ошибке не сообщается.

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

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

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

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

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

ДЛЯ ПРОВЕРКИ ТИПА:

print(type(StringVariable))

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

Это вопрос типа Python 101,

Это простой вопрос, но где ответ не так прост.


в python3 объект "bytes "представляет собой последовательность байтов, объект" string " представляет собой последовательность кодовых точек unicode.

для преобразования из "байтов" в "строку" и из "строки" обратно в "байты" вы используете байты.кодирование и строка.расшифруйте функции. Эти функции принимают два параметра, кодирование и Политика обработки ошибок.

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

Если вы хотите написать надежное программное обеспечение, то вам нужно тщательно подумать о тех параметрах. Вам нужно тщательно подумать о том, в какой кодировке должны быть байты и как вы будете обрабатывать случай, когда они оказываются не действительной последовательностью байтов для кодировка вы думали, что они должны быть. Python по умолчанию использует UTF-8 и выдает ошибку в любой последовательности байтов, которая не является допустимой UTF-8.

print (bytesThing)

Python использует "repr" в качестве резервного преобразования в строку. repr пытается создать код python,который будет воссоздавать объект. В случае объекта bytes это означает, среди прочего, экранирование байтов за пределами диапазона ascii для печати.