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

新手上路,请多包涵

我最近迁移到了 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 到 Python 3 的问题,但这个小声明让我很烦。

原文由 masroore 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 492
2 个回答

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

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

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

 if 'some-pattern' in tmp: continue

您必须使用 bytes 对象来针对 tmp 进行测试:

 if b'some-pattern' in tmp: continue

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

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 .encode() 对字符串进行编码

例子:

 'Hello World'.encode()

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

原文由 Theofilos Papapanagiotou 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题