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

使用csvwriter生成Excel兼容CSV文件时的分隔符异常问题

问题:CSV生成时分隔符被当作值,Excel中出现多余列

从API提取数据后,尝试使用Python的csvwriter生成可在Excel中打开的CSV文件,但出现异常:分隔符被当作值,在实际数据列之间生成了多余列。

原代码

import csv
resources_list="resources_list.csv"

list_keys_res=[]
list_keys_res=list(res['items'][0].keys())

list_items_res=[]
list_items_res=list(res['items'])

resources = open(resources_list, 'w', newline ='')
with resources:
    # identifying header
    writer = csv.writer(resources, delimiter=';')
    header_res = writer.writerow([list_keys_res[1]]+[";"]+[list_keys_res[0]]+[";"]+[list_keys_res[2]]+[";"]+[list_keys_res[4]])
    resource=None
    
    # loop to write the data into each row of the csv file - a row describes 1 resource
    for i in list_items_res:
        resource=list_items_res.index(i)
        list_values_res=[]
        list_values_res=list(list_items_res[resource].values())

        writer.writerow([list_values_res[1]]+[";"]+[list_values_res[0]]+[';']+[list_values_res[2]]+[";"]+[list_values_res[4]])
        i=resource+1

期望生成的CSV格式

name ; id ; userName ; email
"Resource 1" ; 1 ; res1 ; myaddress1@host.com
"Resource 2" ; 2 ; res2 ; myaddress2@host.com
"Resource 3" ; 3 ; res3 ; myaddress3@host.com

实际生成的格式

name;";;id;";;userName;";;email
Resource 1;";;1;";; res1;";; myaddress1@host.com
Resource 2;";;2;";; res2;";; myaddress2@host.com
Resource 3;";;3;";; res3;";; myaddress3@host.com

修正方案

问题核心是手动在writerow的列表中添加了分号,csv.writer会自动使用指定的delimiter=';'来分隔列,手动加入的分号会被当作普通字段值,还会被自动转义,导致出现多余列。

修正后的代码如下:

import csv
resources_list = "resources_list.csv"

# 获取表头字段(按指定顺序)
list_keys_res = list(res['items'][0].keys())
selected_headers = [list_keys_res[1], list_keys_res[0], list_keys_res[2], list_keys_res[4]]

# 获取所有数据项
list_items_res = res['items']

with open(resources_list, 'w', newline='') as resources:
    writer = csv.writer(resources, delimiter=';')
    # 写入表头
    writer.writerow(selected_headers)
    
    # 写入每行数据
    for item in list_items_res:
        values = list(item.values())
        selected_values = [values[1], values[0], values[2], values[4]]
        writer.writerow(selected_values)

优化点说明

  1. 去掉手动拼接的分号,直接传入要写入的字段列表,csv.writer会自动用;分隔列
  2. 简化列表初始化逻辑,无需先创建空列表再覆盖
  3. 遍历数据项时直接使用item,避免通过index查找,提升效率
  4. 提取指定顺序的字段/值时,用列表直接选择,逻辑更清晰

这样生成的CSV会正确使用;作为分隔符,Excel打开后不会出现多余列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:20:29