python 3.5: TypeError: требуется байт-подобный объект, а не ' str ' при записи в файл



Я совсем недавно перешел на 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, но это маленькое заявление подслушивает мне.

2700   7  

7 ответов:

вы открыли файл в бинарном режиме:

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'.

вы можете кодировать строку с помощью .encode()

пример:

'Hello World'.encode()

на цикл вы сравниваете строку с байтами, и именно там код не работает.

декодирование байтов при добавлении в список должно работать. Измененный код должен выглядеть следующим образом:

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

тип байтов был введен в Python 3, и именно поэтому ваш код работал в Python 2. В Python 2 не было данных тип для байтов:

>>> s=bytes('hello')
>>> type(s)
<type 'str'>

для этого небольшого примера: импорт сокета

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' решил мою проблему

вы должны перейти от wb к w:

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'])

после изменения этого ошибка исчезает, но вы не можете записать в файл (в моем случае). Так что, в конце концов, у меня нет ответа?

источник: Как удалить ^M

изменение на ' rb ' приносит мне другую ошибку: io.Перестала работать: пишите

почему бы не попробовать открыть файл как текст?

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

Если вы действительно пытаетесь обработать его как двоичный файл, то рассмотрите возможность кодирования вашей строки.

Вы открыли файл в бинарном режиме:

следующий код будет бросать TypeError: требуется байт-подобный объект, а не'str'.

for line in lines:
    print(type(line))# <class 'bytes'>
    if 'substring' in line:
       print('success')

следующий код будет работать - вы должны использовать функцию decode ():

for line in lines:
    line = line.decode()
    print(type(line))# <class 'str'>
    if 'substring' in line:
       print('success')

Comments

    Ничего не найдено.