Я совсем недавно перешел на Py 3.5. Этот код работал правильно в Python 2.7:
with open(fname, 'rb') as f:
lines = [x.strip() for x in f.readlines()]
for line in lines:
tmp = line.strip().lower()
if 'some-pattern' in tmp: continue
# ... code
После обновления до 3.5 я получаю:
TypeError: a bytes-like object is required, not 'str'
ошибка в последней строке (код поиска шаблона).
Я попытался использовать .decode()
функцию с обеих сторон оператора, а также попытался:
if tmp.find('some-pattern') != -1: continue
- но безрезультатно.
Мне удалось быстро решить почти все проблемы 2: 3, но это небольшое утверждение меня беспокоит.
result = requests.get
и я пытаюсьx = result.content.split("\n")
. Я немного сбит с толку сообщением об ошибке, потому что оно, похоже, подразумевает, чтоresult.content
это строка и.split()
требует объект, похожий на байты .. ?? («Требуется подобный байту объект, а не« str »») ..Ответы:
Вы открыли файл в двоичном режиме:
Это означает, что все данные, прочитанные из файла, возвращаются как
bytes
объекты, а неstr
. Затем вы не можете использовать строку в тесте содержания:Вместо этого вам придется использовать
bytes
объект для проверкиtmp
:или вместо этого откройте файл как текстовый файл, заменив
'rb'
режим на'r'
.источник
'r'
vs , переключение между поведением двоичных и текстовых файлов (например, перевод новых строк и на определенных платформах, как обрабатывается маркер EOF). То, что библиотека (обеспечивающая функциональность ввода-вывода по умолчанию в Python 3, но также доступная в Python 2) теперь также декодирует текстовые файлы по умолчанию, является реальным изменением.'rb'
io
'b'
флаг только при работе с двоичными файлами в DOS / Windows (так как двоичный файл используется по умолчанию в POSIX). Хорошо, что использованиеio
3.x для доступа к файлам имеет двойную цель .Вы можете закодировать вашу строку с помощью
.encode()
Пример:
источник
Как уже упоминалось, вы читаете файл в двоичном режиме, а затем создаете список байтов. В последующем цикле for вы сравниваете строку с байтами, и именно в этом коде происходит сбой.
Декодирование байтов при добавлении в список должно работать. Измененный код должен выглядеть следующим образом:
Тип байтов был введен в Python 3, и поэтому ваш код работал в Python 2. В Python 2 не было типа данных для байтов:
источник
Вы должны изменить с wb на w:
в
После изменения ошибка исчезает, но вы не можете записать в файл (в моем случае). Так в конце концов, у меня нет ответа?
Источник: Как убрать ^ M
Изменение на 'rb' приносит мне другую ошибку: io.UnsupportedOperation: write
источник
для этого небольшого примера: импортное гнездо
добавление «b» до того, как «GET» http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ n 'решило мою проблему
источник
Используйте функцию encode () вместе с жестко закодированным значением String, указанным в одиночной кавычке.
Пример:
ИЛИ
источник
Вы открыли файл в двоичном режиме:
Следующий код выдаст ошибку TypeError: требуется объект, похожий на байты, а не 'str'.
Следующий код будет работать - вы должны использовать функцию decode ():
источник
почему бы не попробовать открыть свой файл как текст?
Кроме того, здесь есть ссылка на python 3.x на официальной странице: https://docs.python.org/3/library/io.html А это открытая функция: https://docs.python.org/3 /library/functions.html#open
Если вы действительно пытаетесь обработать его как двоичный файл, подумайте о кодировании вашей строки.
источник
Я получил эту ошибку, когда пытался преобразовать символ (или строку)
bytes
в код, что-то вроде этого с Python 2.7:Это способ Python 2.7 при работе с символами Юникода.
Это не будет работать с Python 3.6, так как
bytes
требует дополнительного аргумента для кодирования, но это может быть немного сложно, так как разные кодировки могут привести к разным результатам:В моем случае мне пришлось использовать
iso_8859_1
при кодировании байтов, чтобы решить проблему.Надеюсь, это кому-нибудь поможет.
источник