Исправляем ошибку TypeError: str, not bytes в Python 3.2

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Python
Скопировать код
# Для исправления ошибки `TypeError: аргумент должен быть str, а не bytes` следует преобразовать байты в строку методом `.decode()`.

# Пример исправления
bytes_obj = b'бинарные данные'
corrected_str = bytes_obj.decode()  # Здесь используется кодировка 'utf-8' по умолчанию, но можно выбрать и другую
combined = 'Строка и ' + corrected_str

print(combined)  # Ошибка TypeError будет устранена

Примечание: Чтобы совместить байты со строкой, преобразуйте сначала байты в строку с помощью метода bytes.decode(). Это поможет избежать ошибки TypeError.

Кинга Идем в IT: пошаговый план для смены профессии

Когда вы сталкиваетесь с TypeError?

Ошибка TypeError "аргумент должен быть str, не bytes" появляется, когда вы пытаетесь объединить строку со значением типа bytes, не преобразовав его в строку до этого. Типы данных str и bytes в Python несовместимы между собой, и попытка их соединения без нужного предварительного преобразования приводит к возникновению ошибки.

Как исправить ошибку

Записывайте файлы в бинарном режиме

В Python 3 используйте режим 'wb' (write binary) для записи байт.

Python
Скопировать код
with open('data.txt', 'wb') as file:
    file.write(b'Приветствую, байты!')  # Здесь ошибки не будет, байты записываются правильно

Читайте файлы в бинарном режиме

Для чтения бинарных файлов используйте режим 'rb' (read binary).

Используйте buffer для записи байтов в текстовый файл

buffer позволяет записывать байтовые данные в текстовый поток.

Python
Скопировать код
with open('data.txt', 'w') as file:
    file.buffer.write(b'Добро пожаловать в мир байтов!')  # Байты записаны в текстовый файл

Декодируйте байты перед использованием как строки

Для преобразования байтов в строку с помощью нужной кодировки используйте метод .decode().

Python
Скопировать код
binary_data = b'Бинарный вальс.'
string_data = binary_data.decode('utf-8')

Работа с base64

Когда вы работаете с данными в формате base64, сначала декодируйте их в бинарный формат.

Python
Скопировать код
import base64

base64_data = base64.b64encode(b'Глубокое басовое эхо')
with open('data.bin', 'wb') as file:
    file.write(base64_data)  # Записываем данные в формате base64 в виде бинарных данных

Визуализация

Декодирование и кодирование данных можно представить как отправку секретного сообщения:

Markdown
Скопировать код
📂 = Пакет данных (bytes)
✉️ = Текст сообщения (str)

Отправка зашифрованного сообщения:

plaintext
Скопировать код
send_secret('✉️', '📂')  # TypeError: Сообщение должно быть в формате str, а не bytes

Преобразование сообщения с помощью декодирования:

Python
Скопировать код
send_secret('✉️', decode_secret('📂'))  # Секретный декодер успешно сработал!

Основная идея: Данные (bytes) следует декодировать в читаемый вид (str) перед отправкой.

Как стать гостем на "вечеринке кода"

Укажите язык (кодировку)

Всегда используйте нужную кодировку при работе со строками и файлами.

Переход с Python 2 на Python 3

Тщательно проверяйте все строки и байтовые данные при переносе кода из Python 2 в Python 3.

Используйте блоки try-except

Оберните ваш код в блоки try-except, чтобы избежать нежелательных ошибок TypeError.

Python
Скопировать код
try:
    сombined_string(b'байты в ритме танго')
except TypeError:
    print('Управление передано отладчику!')  # TypeError не получил приглашение

Чего стоит избегать

  • Использование режима 'w' для записи байт в Python 3.
  • Принятие за истину, что по умолчанию применяется кодировка 'utf-8' при декодировании.
  • Пропусканье .buffer при работе с файловыми потоками для записи байт.

Полезные материалы

  1. Встроенные типы данных в Python 3.12.2Полное руководство по типам данных, включая str и bytes.
  2. Метод encode() для строк в Python — Руководство по методу encode(), позволяющему преобразовывать строки в байты.
  3. Функция bytes() в Python — Объяснение работы функции bytes().
  4. Руководство по символьным кодировкам в Python — Учебник по использованию разных кодировок и их конвертации.
  5. Изменяемые и неизменяемые объекты в Python — Обзор изменяемых и неизменяемых объектов в Python, включая упоминание типа bytes.