Содержание
Краткая памятка по работе с байтами и строками в Python
- В Python 3 всегда используйте.encode() для преобразования строки в байты.
- В Python 3 всегда используйте.decode() для преобразования байтов в строку.
- Всегда явно указывайте кодировку (например, ‘utf-8’) при encode/decode.
- В Python 2 помните, что str — это байты, а unicode — строки.
- Для преобразования unicode в байты в Python 2 используйте.encode().
- Для преобразования байтов в unicode в Python 2 используйте.decode().
- Избегайте смешивания байтов и строк в одном выражении без явного преобразования.
- При работе с файлами всегда открывайте их в правильном режиме (‘rb’ для байтов, ‘r’ для текста).
- Используйте библиотеку codecs для работы с разными кодировками.
- Проверяйте тип данных с помощью type() или isinstance(), чтобы избежать ошибок.
- При сомнениях в кодировке данных используйте chardet для ее определения.
Пример 1:
В этом примере для перевода данных использовался метод encode(). Это наиболее часто используемый и рекомендуемый способ преобразования строк Python в байты. Одна из основных причин — его легче читать. Синтаксис метода кодирования следующий:
Строка, которую вы хотите преобразовать, называется строкой. Используемый вами метод кодирования называется «кодирование». Строка «Error» показывает сообщение об ошибке. UTF-8 стал стандартом со времен Python 3.
my_str = «sample code for conversion» my_str_encoded = my_str.encode(encoding = ‘UTF-8’) print(my_str_encoded) for bytes in my_str_encoded: print(bytes,end =»)
В качестве примера мы использовали строку my_str = “Sample code for conversion”. Мы использовали кодировку для преобразования после инициализации строки, а затем распечатали вывод строки. После этого мы распечатали отдельные байты следующим образом:
Преобразование байтов в строку в Python 3
Начиная с Python 3, пришлось отказаться от старого способа работы с ASCII, и Python стал полностью Unicode.
Это означает, что мы потеряли явный тип Unicode: u»string» — каждая строка — это u»string»!
Чтобы отличить эти строки от старых добрых строк байтов, мы познакомились с новым спецификатором для них — b»string».
Это было добавлено в Python 2.6, но не служило реальной цели, кроме подготовки к Python 3, поскольку все строки были байтовыми строками в 2.6.
Строки байтов в Python 3 официально называются bytes, неизменной последовательностью целых чисел в диапазоне 0 <= x <256. Другой bytes — подобный объект, добавленный в 2.6, bytearray — похож на bytes, но изменяемый.
Преобразование байтов в строку в Python 2
В Python 2 набор байтов и строка — это практически одно и то же: строки — это объекты, состоящие из однобайтовых символов, что означает, что каждый символ может хранить 256 значений. Вот почему их иногда называют строками байтов.
Это замечательно при работе с байтовыми данными — мы просто загружаем их в переменную и готовы к печати:
Преобразование байтов в Unicode (Python 2)
Здесь нам придется использовать тип Python 2 Unicode, который предполагается и автоматически используется в Python 3. В нем строки хранятся как последовательность кодовых точек, а не байтов.
Помните о своей кодировке
Здесь следует предостеречь — байты могут по-разному интерпретироваться в разных кодировках. Из- за того, что из коробки доступно около 80 различных кодировок, может быть нелегко узнать, есть ли у вас правильная!
s = ‘\xf8\xe7’ # This one will let us know we used the wrong encoding >>> (‘UTF-8’) UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xf8 in position 0: invalid start byte # These two overlaps and this is a valid string in both >>> (‘latin1’) øç (‘iso8859_5’) јч
Пример 2:
Чтобы преобразовать строку в байты, мы можем использовать встроенный в Python класс Bytes: просто укажите строку в качестве первого аргумента функции Object() { [native code] } класса Bytes, а затем укажите кодировку. Изначально у нас есть строка с названием «my_str». Мы преобразовали эту конкретную строку в байты.
my_str = «welcome to Python» str_one = bytes(my_str, ‘utf-8’) str_two = bytes(my_str, ‘ascii’) print(str_one,’\n’) for byte in str_one: print(byte, end=») print(‘\n’) for byte in str_two: print(byte,end=»)
Пример 3:
В нашем третьем примере мы снова используем метод encode() для преобразования строк в байты. Это удобный способ конвертировать строки в байты.
Мы рассматриваем my_str=«Learn about programming» как источник, который нужно преобразовать в байты в приведенном выше коде. На следующем шаге мы превратили строку в байты с помощью метода encode(). До и после преобразования функция type() используется для проверки типа объекта. Здесь используется enc = utf-8.
Часто задаваемые вопросы о переводе строки байтов в байты в Python
Вопрос: В чем разница между байтами и строкой в Python?
Ответ: Байты — это неизменяемая последовательность байтов (чисел от 0 до 255), а строка — это последовательность символов Unicode.
Вопрос: Как преобразовать строку в байты в Python 3?
Ответ: Используйте метод.encode() для строки, указав кодировку, например ‘utf-8’.
Вопрос: Как преобразовать байты в строку в Python 3?
Ответ: Используйте метод.decode() для объекта bytes, указав кодировку.
Вопрос: Что произойдет, если не указать кодировку при декодировании?
Ответ: Python использует кодировку по умолчанию (обычно UTF-8), что может привести к ошибке, если байты закодированы иначе.
Вопрос: Как преобразовать строку в байты в Python 2?
Ответ: Используйте функцию bytes() или метод.encode() для строки.
Вопрос: В чем разница между str и bytes в Python 2?
Ответ: В Python 2 str — это последовательность байтов, а unicode — последовательность символов. bytes — это псевдоним для str.
Вопрос: Как преобразовать байты в строку Unicode в Python 2?
Ответ: Используйте метод.decode() для строки байтов.
Вопрос: Что такое кодировка и почему она важна?
Ответ: Кодировка — это правило преобразования символов в байты. Неправильная кодировка приводит к искажению данных (кракозябрам).
Вопрос: Какая кодировка самая распространенная?
Ответ: UTF-8 — самая популярная и универсальная кодировка для веба и большинства приложений.
Вопрос: Что делать, если при декодировании возникает ошибка UnicodeDecodeError?
Ответ: Убедитесь, что вы используете правильную кодировку, или используйте обработку ошибок, например errors=’ignore’ или errors=’replace’.





















