我最近已经迁移到 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
或以文本文件形式打开文件,而不是用'r'
'rb'
模式。
.encode()
对字符串进行编码
例子:
'Hello World'.encode()
就像已经提到的一样,您正在以二进制模式读取文件,然后创建一个字节列表。在下面的for循环中,您将字符串与字节进行比较,这就是代码失败的地方。
在将字节添加到列表时对字节进行解码应该可以。更改后的代码应如下所示:
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'>