You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:43:50