TypeError: изисква се обект, подобен на bytes, а не 'str' при запис във файл в Python3
Съвсем наскоро преминах към 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 бързо, но това малко твърдение ме притеснява.
497
3
Отворили сте файла в двоичен режим:
Това означава, че всички данни, прочетени от файла, се връщат като обекти
bytes
, а не катоstr
. Тогава не можете да използвате низ в тест за ограничаване:Вместо това ще трябва да използвате обект
bytes
, за да тествате срещуtmp
:или вместо това да отворите файла като текстов файл, като замените режима
'rb'
с'r'
.Както вече беше споменато, вие четете файла в двоичен режим и след това създавате списък от байтове. В следващия цикъл за сравнявате низ с байтове и това е мястото, където кодът се проваля.
Декодирането на байтовете, докато се добавят към списъка, би трябвало да работи. Промененият код трябва да изглежда по следния начин:
Типът байтове е въведен в Python 3 и затова кодът ви е работил в Python 2. В Python 2 нямаше тип данни за байтове:
за този малък пример: импортиране на сокет
Добавяне на "b" преди 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n' реши проблема ми