使用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
相关产品推荐
相关产品推荐

