Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
07 Май 2023
2 мин
2703

Обработка ошибки «TypeError: a bytes-like object is required, not ‘str'» в Python 3

При переходе с Python 2 на Python 3 могут возникать различные проблемы, связанные с изменением некоторых функций и методов. Одна из таких проблем — это

При переходе с Python 2 на Python 3 могут возникать различные проблемы, связанные с изменением некоторых функций и методов. Одна из таких проблем — это ошибка «TypeError: a bytes-like object is required, not ‘str'», которая может возникнуть при работе с файлами.

Освойте Python на курсе от Skypro. Вас ждут 400 часов обучения и практики (достаточно десяти часов в неделю), подготовка проектов для портфолио, индивидуальная проверка домашних заданий и помощь опытных наставников. Получится, даже если у вас нет опыта в IT.

Пример проблемы

with open('file.txt', 'rb') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    if 'pattern' in line:
        pass
    # ... другой код

В этом примере открывается файл на чтение в бинарном режиме (‘rb’), затем из него считываются строки, которые обрабатываются в цикле. Если в какой-либо строке встречается ‘pattern’, то выполняется определенное действие. Именно на этом шаге и возникает ошибка «TypeError: a bytes-like object is required, not ‘str'».

Причина ошибки

Проблема заключается в том, что при чтении файла в бинарном режиме (‘rb’) строки считываются в виде последовательности байтов, а не в виде строк. Поэтому при выполнении операции ‘pattern’ in line возникает ошибка, так как Python ожидает получить объект типа bytes, а не str. В Python 2 такой проблемы не возникает, так как различие между строками и байтами не так строго определено, как в Python 3.

На курсе Skypro «Python-разработчик» освоите основные инструменты программирования, получите опыт на реальных проектах и сможете стартовать в профессии уверенным новичком. Преподаватели — практикующие программисты с большим опытом, а в центре карьеры помогут составить цепляющее резюме и подготовиться к собеседованию.

Решение проблемы

Для решения этой проблемы можно использовать метод decode(), который преобразует объект типа bytes в строку. Это можно сделать прямо в цикле при обработке строк:

with open('file.txt', 'rb') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    line = line.decode('utf-8')  # декодирование строки
    if 'pattern' in line:
        pass
    # ... другой код

Таким образом, строка сначала декодируется из байтов в строку, а уже затем выполняется поиск подстроки в ней. Это позволяет избежать ошибки «TypeError: a bytes-like object is required, not ‘str'».

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий