При переходе с 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'».
Добавить комментарий