TypeError:在Python 3中写入文件时,需要类似字节的对象,而不是“str”

2022-09-05 01:18:36

我最近迁移到了Python 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后,我得到了:

类型错误:需要类似字节的对象,而不是“str”

错误位于最后一行(模式搜索代码)。

我尝试过在语句的任一侧使用该函数,也尝试过:.decode()

if tmp.find('some-pattern') != -1: continue

- 无济于事。

我能够快速解决几乎所有的Python 2-to-Python 3问题,但是这个小小的声明让我烦恼。


答案 1

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

with open(fname, 'rb') as f:

这意味着从文件中读取的所有数据都作为对象返回,而不是 。然后,您不能在包含测试中使用字符串:bytesstr

if 'some-pattern' in tmp: continue

您必须使用对象来测试:bytestmp

if b'some-pattern' in tmp: continue

或者通过将模式替换为 来将文件作为文本文件打开。'rb''r'


答案 2

您可以使用.encode()

例:

'Hello World'.encode()

如错误所述,为了将字符串写入文件,您需要先将其编码为类似字节的对象,然后将其编码为字节字符串。encode()