我最近迁移到 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()在语句的任一侧使用该函数,也尝试过:
.decode()
if tmp.find('some-pattern') != -1: continue
- 无济于事。
我能够快速解决几乎所有 2:3 的问题,但是这个小声明让我很烦。
您以二进制模式打开文件:
with open(fname, 'rb') as f:
这意味着从文件中读取的所有数据都作为bytes对象返回,而不是str. 然后,您不能在包含测试中使用字符串:
bytes
str
if 'some-pattern' in tmp: continue
您必须使用一个bytes对象来测试tmp:
tmp
if b'some-pattern' in tmp: continue
或将文件作为文本文件打开,而不是将'rb'模式替换为'r'.
'rb'
'r'