Issue
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.
Solution
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 tmp
instead:
if b'some-pattern' in tmp: continue
or open the file as a textfile instead by replacing the 'rb'
mode with 'r'
.
Answered By - Martijn Pieters
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.