Исправляем ошибку TypeError: str, not bytes в Python 3.2
Быстрый ответ
# Для исправления ошибки `TypeError: аргумент должен быть str, а не bytes` следует преобразовать байты в строку методом `.decode()`.
# Пример исправления
bytes_obj = b'бинарные данные'
corrected_str = bytes_obj.decode() # Здесь используется кодировка 'utf-8' по умолчанию, но можно выбрать и другую
combined = 'Строка и ' + corrected_str
print(combined) # Ошибка TypeError будет устранена
Примечание: Чтобы совместить байты со строкой, преобразуйте сначала байты в строку с помощью метода bytes.decode()
. Это поможет избежать ошибки TypeError.
Когда вы сталкиваетесь с TypeError?
Ошибка TypeError "аргумент должен быть str, не bytes"
появляется, когда вы пытаетесь объединить строку со значением типа bytes
, не преобразовав его в строку до этого. Типы данных str
и bytes
в Python несовместимы между собой, и попытка их соединения без нужного предварительного преобразования приводит к возникновению ошибки.
Как исправить ошибку
Записывайте файлы в бинарном режиме
В Python 3 используйте режим 'wb' (write binary) для записи байт.
with open('data.txt', 'wb') as file:
file.write(b'Приветствую, байты!') # Здесь ошибки не будет, байты записываются правильно
Читайте файлы в бинарном режиме
Для чтения бинарных файлов используйте режим 'rb' (read binary).
Используйте buffer для записи байтов в текстовый файл
buffer
позволяет записывать байтовые данные в текстовый поток.
with open('data.txt', 'w') as file:
file.buffer.write(b'Добро пожаловать в мир байтов!') # Байты записаны в текстовый файл
Декодируйте байты перед использованием как строки
Для преобразования байтов в строку с помощью нужной кодировки используйте метод .decode()
.
binary_data = b'Бинарный вальс.'
string_data = binary_data.decode('utf-8')
Работа с base64
Когда вы работаете с данными в формате base64, сначала декодируйте их в бинарный формат.
import base64
base64_data = base64.b64encode(b'Глубокое басовое эхо')
with open('data.bin', 'wb') as file:
file.write(base64_data) # Записываем данные в формате base64 в виде бинарных данных
Визуализация
Декодирование и кодирование данных можно представить как отправку секретного сообщения:
📂 = Пакет данных (bytes)
✉️ = Текст сообщения (str)
Отправка зашифрованного сообщения:
send_secret('✉️', '📂') # TypeError: Сообщение должно быть в формате str, а не bytes
Преобразование сообщения с помощью декодирования:
send_secret('✉️', decode_secret('📂')) # Секретный декодер успешно сработал!
Основная идея: Данные (bytes) следует декодировать в читаемый вид (str) перед отправкой.
Как стать гостем на "вечеринке кода"
Укажите язык (кодировку)
Всегда используйте нужную кодировку при работе со строками и файлами.
Переход с Python 2 на Python 3
Тщательно проверяйте все строки и байтовые данные при переносе кода из Python 2 в Python 3.
Используйте блоки try-except
Оберните ваш код в блоки try-except, чтобы избежать нежелательных ошибок TypeError.
try:
сombined_string(b'байты в ритме танго')
except TypeError:
print('Управление передано отладчику!') # TypeError не получил приглашение
Чего стоит избегать
- Использование режима 'w' для записи байт в Python 3.
- Принятие за истину, что по умолчанию применяется кодировка 'utf-8' при декодировании.
- Пропусканье
.buffer
при работе с файловыми потоками для записи байт.
Полезные материалы
- Встроенные типы данных в Python 3.12.2 — Полное руководство по типам данных, включая
str
иbytes
. - Метод encode() для строк в Python — Руководство по методу
encode()
, позволяющему преобразовывать строки в байты. - Функция bytes() в Python — Объяснение работы функции
bytes()
. - Руководство по символьным кодировкам в Python — Учебник по использованию разных кодировок и их конвертации.
- Изменяемые и неизменяемые объекты в Python — Обзор изменяемых и неизменяемых объектов в Python, включая упоминание типа bytes.