I’ve very recently migrated to Python 3.5.
This code was working properly in 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
After upgrading to 3.5, I’m getting the:
TypeError: a bytes-like object is required, not ‘str’
The error is on the last line (the pattern search code).
I’ve tried using the
.decode() function on either side of the statement and also tried:
if tmp.find('some-pattern') != -1: continue
– to no avail.
I was able to resolve almost all Python 2-to-Python 3 issues quickly, but this little statement was bugging me.
You opened the file in binary mode:
with open(fname, 'rb') as f:
This means that all data read from the file is returned as
bytes objects, not
str. You cannot then use a string in a containment test:
if 'some-pattern' in tmp: continue
You’d have to use a
bytes object to test against
if b'some-pattern' in tmp: continue
or open the file as a textfile instead by replacing the
'rb' mode with
Answered By – Martijn Pieters
Answer Checked By – Candace Johnson (BugsFixing Volunteer)