协慌网

登录 贡献 社区

TypeError:在 Python3 中写入文件时,需要一个类似字节的对象,而不是'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 问题,但是这个小小的声明困扰着我。

答案

您以二进制模式打开文件:

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