Python报TypeError: Can only concatenate str (not "bytes") to str解决方法
错误根因
这是典型的Python 2旧项目迁移到Python 3环境的兼容性报错:
- Python 2未做文本类型和二进制类型的严格拆分,二进制模式打开的文件调用
read(1)返回值为str类型,和代码中初始化的string = ""类型一致,可直接拼接,这也是旧项目原代码能正常运行的原因。 - Python 3中
str是统一的Unicode文本类型,二进制模式下文件读取返回的是独立的bytes类型,两类对象不允许直接拼接。代码中string初始化为str类型,读到的byte是bytes类型,执行string += byte时就会触发该TypeError。
修复方法
优先采用「字节收集+统一解码」的方案,符合Python 3二进制文件操作的规范,同时性能更好,适配模型资源读取的场景:
import struct def ReadNullTerminatedString(f): byte = f.read(1) # 初始化为空字节串,和读取返回的类型保持一致 read_bytes = b"" while struct.unpack('B', byte)[0] != 0: read_bytes += byte byte = f.read(1) # 旧二进制资源优先使用latin-1解码(覆盖全部单字节值,不会触发编码异常),确认资源为UTF-8编码时可替换为'utf-8' return read_bytes.decode('latin-1')
不推荐逐字节解码后拼接的写法,该方式处理大体积模型资源时性能损耗更明显。
内容的提问来源于stack exchange,提问作者Agent Zero
相关产品推荐
相关产品推荐

