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

使用Python csv模块分组CSV写入新文件字段错位如何解决

问题根因

你的代码存在4个核心问题导致输出错位:

  • 列索引错误:你给出的原始CSV每行仅3列,按0起始索引,制造商为row[0]、车辆详情为row[1]、车型为row[2],代码中使用row[3]、row[4]本身和数据结构不匹配。
  • 分组存储逻辑错误:你将同一制造商下的所有字段值全部追加到同一个一维列表中,没有按「每行一组详情+车型」的结构存储,写入时整个列表被当成单个单元格内容,自然全部挤在第一列。
  • 读写配置混乱:代码中多次重复创建读写对象,分隔符一会用;一会用,,读写分隔符不匹配直接导致列拆分失败。
  • 表头配置错误:定义的fields=['test','name','object']和你期望输出的三列表头完全不对应。
最简实现方案

不需要中间生成临时文件、不需要提前把所有数据存到字典里,逐行遍历的时候记录上一行的制造商名称,匹配到相同制造商时把第一列置空即可,一次读写就能完成需求:

import csv

# 输出表头
fields = ['manufacturer', 'car_details', 'car']
last_manu = None

with open('work.csv', 'r', newline='', encoding='utf-8') as in_f, \
     open('result.csv', 'w', newline='', encoding='utf-8') as out_f:
    # 如果原始文件是多空格分隔,把delimiter改成' ',保留skipinitialspace=True自动忽略多余空格
    reader = csv.reader(in_f, delimiter=',', quotechar='"', skipinitialspace=True)
    writer = csv.writer(out_f, delimiter=',')
    writer.writerow(fields)

    for row in reader:
        if not row:  # 跳过空行
            continue
        curr_manu, detail, car = row[0].strip(), row[1].strip(), row[2].strip()
        if curr_manu == last_manu:
            # 同制造商,第一列留空
            writer.writerow(['', detail, car])
        else:
            writer.writerow([curr_manu, detail, car])
            last_manu = curr_manu

提示:如果你的原始CSV是用不定长空格做分隔符,只需要把reader初始化参数里的delimiter=','改成delimiter=' '即可,skipinitialspace=True参数会自动处理列之间的多个空格,不会出现空列的问题。

输出验证

运行后生成的result.csv完全匹配预期格式:

manufacturer,car_details,car
toyota,fast,Prius
,slow,yaris
,fast,corolla
,slow,sunshine
mercedes,fast,benz
,fast,something
mazda,fast,bus

用表格工具打开时,同制造商的首行显示名称,后续行该列为空,其余字段全部按列对齐,不会出现内容挤在同一列的问题。

内容的提问来源于stack exchange,提问作者momonosuke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 00:57:54