print指定file为二进制文件时传入bytes的报错信息易混淆
print传入bytes参数到二进制写模式文件时报错的原因说明
print函数的官方文档明确约定:所有传入的非关键字参数都会被强制转换为字符串类型后再执行后续写入逻辑,该设计是为了适配print面向文本输出的核心定位。
你遇到的报错属于执行流程中间结果和输入预期不一致导致的理解偏差:
- 你传入
b'abc'作为print的第一个参数,print执行时第一步就会把该bytes对象转换为字符串类型,转换后的结果为字符串"b'abc'",已经不再是原始的bytes数据 - 你指定的
file参数指向以wb(二进制写入)模式打开的文件对象,这类对象的write()方法仅接收bytes或缓冲区类型的输入,接收到字符串类型的参数时就会触发对应的TypeError。
报错复现代码如下:
>>> out = open('temp', 'wb') >>> print(b'abc', file=out) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: write() argument 1 must be bytes or buffer, not str
解决方案
- 若需要向二进制文件写入原始bytes数据,直接调用文件对象的
write()方法即可,不需要经过print函数处理:
out = open('temp', 'wb') out.write(b'abc') out.close()
- 若坚持要使用print函数输出内容,请使用文本写入模式(如
w)打开文件,或先将bytes对象按对应编码解码为字符串后再传入print:
# 方案1:使用文本模式打开文件 out = open('temp', 'w', encoding='utf-8') print(b'abc'.decode('utf-8'), file=out) out.close()
内容的提问来源于stack exchange,提问作者user17145324
相关产品推荐
相关产品推荐

