为何raw为bytes类型,用print写入wb模式文件仍抛出TypeError?
问题原因及解决方案
核心原因
问题出在print()函数的默认行为上:
- 当你把
bytes对象传给print()并指定输出到二进制模式打开的文件时,print()会先把bytes对象转换成字符串形式(比如b'Some text, dude!'这种带b前缀的字符串),然后尝试把这个字符串写入二进制文件。 - 但二进制模式的文件只接受
bytes类型的数据,不接受字符串,所以直接触发TypeError。
哪怕你用raw = bytes(txt.encode('ascii')),得到的还是bytes对象,print()依然会执行上述转换步骤,所以错误不会消失。
解决办法
直接用文件对象的write()方法写入字节数据,跳过print()的字符串转换:
txt = 'Some text, dude!' with open('to_load', mode='wb') as f: raw = txt.encode('ascii') f.write(raw)
额外说明
print()是为文本输出设计的,它会自动给内容加换行符,还会对所有传入的对象调用str()做转换。而二进制文件需要的是原始字节数据,不需要这些额外处理,所以write()才是正确的选择。
内容的提问来源于stack exchange,提问作者rudicangiotti
相关产品推荐
相关产品推荐

