Я'совсем недавно перешел на 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, но это небольшое утверждение не дает мне покоя.
Вы открыли файл в двоичном режиме:
with open(fname, 'rb') as f:
Это означает, что все данные, считанные из файла, возвращаются в виде объектов bytes
, а не str
. Вы не можете использовать строку в тесте на сдерживание:
if 'some-pattern' in tmp: continue
Вместо этого вам придется использовать объект bytes
для проверки на tmp
:
if b'some-pattern' in tmp: continue
или открыть файл как текстовый файл, заменив режим 'rb'
на 'r'
.
Вы можете закодировать вашу строку, используя .кодирование()
Пример:
'Hello World'.encode()
Как уже было сказано, вы читаете файл в двоичном режиме, а затем создаете список байтов. В следующем цикле for вы сравниваете строку с байтами, и именно в этом месте код дает сбой.
Декодирование байтов при добавлении в список должно сработать. Измененный код должен выглядеть следующим образом:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
Тип данных bytes был введен в Python 3, и именно поэтому ваш код работал в Python 2. В Python 2 не было типа данных для байтов:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>
Вы должны меняться от банка к Вт:
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'wb'))
self.myCsv.writerow(['title', 'link'])
для
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'w'))
self.myCsv.writerow(['title', 'link'])
После изменения этого, ошибка исчезает, но вы можете'т писать в файл (в моем случае). Так все-таки, я не'Т есть ответ?
Источник: https://stackoverflow.com/questions/3191289/how-to-remove-m/3191470#3191470
Изменения в 'РБ' приносит мне другую ошибку: Ио.UnsupportedOperation: написать
для этого небольшого примера: импортировать сокет
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(**b**'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
while True:
data = mysock.recv(512)
if ( len(data) < 1 ) :
break
print (data);
mysock.close()
добавив "b" перед 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n' решило мою проблему
Вы открыли файл в бинарном режиме:
Следующий код будет бросать ошибку TypeError: требуется байт-как объект, не 'ул.'.
for line in lines:
print(type(line))# <class 'bytes'>
if 'substring' in line:
print('success')
Следующий код будет работать - вы должны использовать декодировать() функции:
for line in lines:
line = line.decode()
print(type(line))# <class 'str'>
if 'substring' in line:
print('success')
почему бы не попробовать открыть файл как текст?
with open(fname, 'rt') as f:
lines = [x.strip() for x in f.readlines()]
Кроме того, вот ссылка для Python 3.X на официальной странице: https://docs.python.org/3/library/io.html И это открытая функция: https://docs.python.org/3/library/functions.html#open
Если вы действительно пытаетесь справиться с этим, а потом бинарный считать кодировку строки.