如何解决CSV输出时出现的TypeError:需字节类对象而非字符串
解决Python CSV写入时的
TypeError: a bytes-like object is required, not 'str'问题 问题场景
你运行这段处理CSV的Python代码时遇到了字节/字符串类型不匹配的错误,先回顾下你提供的输入数据和出错代码:
输入CSV内容:
c1,c2,c3,c4,c5,c6 16,28-Sep-17,9700,291.8,291.8,9964.4 17,28-Sep-17,9700,186.3,186.3,9872.6 18,28-Sep-17,9700,166.6,166.6,9871.5 24,28-Sep-17,9800,227.5,227.5,9952.2 25,28-Sep-17,9800,202.55,202.55,9916.2
出错的核心代码片段:
with open('out1.csv', 'wb') as f_output: csv_output = csv.writer(f_output) csv_output.writerows(zip_longest(*data, fillvalue=''))
错误原因
在Python 3中,'wb'是二进制写入模式,这种模式要求写入的内容必须是字节对象(bytes),但csv.writer默认输出的是字符串(str)类型数据,两者类型不匹配,就抛出了这个TypeError。
修复方案
把文件打开模式从'wb'改成'w'(文本写入模式),同时加上newline=''参数——这是Python官方文档推荐的写法,能避免不同操作系统下换行符混乱的问题:
with open('out1.csv', 'w', newline='') as f_output: csv_output = csv.writer(f_output) csv_output.writerows(zip_longest(*data, fillvalue=''))
完整修复后的代码
这里把整个修正后的代码贴出来,你可以直接运行:
from itertools import zip_longest from collections import defaultdict import csv models = defaultdict(list) with open('outpuop.csv') as f_input: csv_input = csv.reader(f_input) header = next(csv_input) for row in csv_input: # Convert c3 to c6 into floats row[2:6] = map(float, row[2:6]) if row[2] > row[5]: if row[4] != 0: TV = row[4] - (row[2] - row[5]) models[row[2]].append(TV) else: TV = row[3] - (row[2] - row[5]) models[row[2]].append(TV) else: tv = row[4] models[row[2]].append(tv) columns = sorted(models.keys()) data = [[int(column)] + ["{:.2f}".format(v) for v in models[column]] for column in columns] # 修复的关键行 with open('out1.csv', 'w', newline='') as f_output: csv_output = csv.writer(f_output) csv_output.writerows(zip_longest(*data, fillvalue=''))
额外提示
为什么要加newline=''?因为当你用文本模式打开文件时,Python会自动转换换行符(比如把\n转换成Windows的\r\n),但csv.writer自己已经处理了换行逻辑,加上newline=''可以让Python不干预,交给csv模块处理,避免出现多余的空行。
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

