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

Python写入CSV时字符被逗号拆分的问题求助

问题描述

尝试读取一个CSV文件并将数据写入另一个CSV文件,但执行后发现写入的数据中每个字符都被逗号分隔。

原代码

with open(filenameInput, 'r') as csvfile:
dfi = pd.read_csv (filenameInput)
dfi - dfi.iloc[:-1]
print(dfi)


f = dfi['diagnosis(1=m, 0=b)'].gt(10)
f = str(f.bool)

t = dfi['diagnosis(1=m, 0=b)'].gt(-1)
t = str(t.bool)

morb = dfi['diagnosis(1=m, 0=b)'].gt(0)
morb = str(morb.bool)
print(morb)

if morb == f and chance > 35:

  with open(filename0, 'a+', newline='') as csvfile2:
    read = list(csv.reader(csvfile))
    print(read) 
    read = str(read)
    print("")
    print(read)
    read = read.replace("[['diagnosis(1=m, 0=b)', 'radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean', 'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean', 'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se', 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se', 'fractal_dimension_se', 'radius_worst', 'texture_worst', 'perimeter_worst', 'area_worst', 'smoothness_worst', 'compactness_worst', 'concavity_worst', 'concave points_worst', 'symmetry_worst', 'fractal_dimension_worst'], [", """)
    read = read.replace("]]", "")
    read = read.replace(" ", "")
    read = read.replace("'", [""])
    print(read)
    writer = csv.writer(csvfile2)
    writer.writerow(read)
    print("")
    print(list(read))

写入后的CSV内容

0,",",9,.,5,0,4,",",1,2,.,4,4,",",6,0,.,3,4,",",2,7,3,.,9,",",0,.,1,0,2,4,",",0,.,0,6,4,9,2,",",0,.,0,2,9,5,6,",",0,.,0,2,0,7,6,",",0,.,1,8,1,5,",",0,.,0,6,9,0,5,",",0,.,2,7,7,3,",",0,.,9,7,6,8,",",1,.,9,0,9,",",1,5,.,7,",",0,.,0,0,9,6,0,6,",",0,.,0,1,4,3,2,",",0,.,0,1,9,8,5,",",0,.,0,1,4,2,1,",",0,.,0,2,0,2,7,",",0,.,0,0,2,9,6,8,",",1,0,.,2,3,",",1,5,.,6,6,",",6,5,.,1,3,",",3,1,4,.,9,",",0,.,1,3,2,4,",",0,.,1,1,4,8,",",0,.,0,8,8,6,7,",",0,.,0,6,2,2,7,",",0,.,2,4,5,",",0,.,0,7,7,7,3,],",",[,0,",",9,.,5,0,4,",",1,2,.,4,4,",",6,0,.,3,4,",",2,7,3,.,9,",",0,.,1,0,2,4,",",0,.,0,6,4,9,2,",",0,.,0,2,9,5,6,",",0,.,0,2,0,7,6,",",0,.,1,8,1,5,",",0,.,0,6,9,0,5,",",0,.,2,7,7,3,",",0,.,9,7,6,8,",",1,.,9,0,9,",",1,5,.,7,",",0,.,0,0,9,6,0,6,",",0,.,0,1,4,3,2,",",0,.,0,1,9,8,5,",",0,.,0,1,4,2,1,",",0,.,0,2,0,2,7,",",0,.,0,0,2,9,6,8,",",1,0,.,2,3,",",1,5,.,6,6,",",6,5,.,1,3,",",3,1,4,.,9,",",0,.,1,3,2,4,",",0,.,1,1,4,8,",",0,.,0,8,8,6,7,",",0,.,0,6,2,2,7,",",0,.,2,4,5,",",0,.,0,7,7,7,3
问题原因与解决方案

核心问题

  1. 字符串写入错误:你把csv.reader读取的列表转成了字符串,writer.writerow()接收可迭代对象时,会把字符串的每个字符当作单独元素,导致每个字符被逗号分隔。
  2. 语法与逻辑错误:
    • with open(...)块下的代码未缩进,属于语法错误。
    • dfi - dfi.iloc[:-1]未赋值,操作无效,需改为dfi = dfi - dfi.iloc[:-1](如果这是你的意图)。
    • f.bool是方法,需加括号调用f.bool();将布尔值转字符串再比较完全多余,直接用布尔值判断即可。
    • 混用pandas和csv模块,增加复杂度且易出错。

修正后的代码

方案1:用pandas处理(推荐)

直接用pandas完成读取、判断和写入,逻辑更简洁:

import pandas as pd

# 读取CSV文件
dfi = pd.read_csv(filenameInput)
# 若需要减去最后一行数据,补充赋值
dfi = dfi - dfi.iloc[:-1]
print(dfi)

# 直接用布尔值判断,这里用any()判断列中是否存在符合条件的值,all()则是所有值都符合
f = dfi['diagnosis(1=m, 0=b)'].gt(10).any()
morb = dfi['diagnosis(1=m, 0=b)'].gt(0).any()
print(morb)

# 布尔值直接比较
if morb == f and chance > 35:
    # 追加写入CSV,header=False避免重复写表头
    dfi.to_csv(filename0, mode='a', header=False, index=False)

方案2:用csv模块处理

若坚持使用csv模块,修正写入逻辑:

import csv
import pandas as pd

dfi = pd.read_csv(filenameInput)
dfi = dfi - dfi.iloc[:-1]
print(dfi)

f = dfi['diagnosis(1=m, 0=b)'].gt(10).any()
morb = dfi['diagnosis(1=m, 0=b)'].gt(0).any()
print(morb)

if morb == f and chance > 35:
    # 重新读取原始文件内容
    with open(filenameInput, 'r') as csvfile:
        reader = csv.reader(csvfile)
        rows = list(reader)
    
    with open(filename0, 'a+', newline='') as csvfile2:
        writer = csv.writer(csvfile2)
        # 写入所有行,可按需选择行
        writer.writerows(rows)

关键说明

  • 不要将列表转成字符串后再做替换操作,直接操作列表/数据框更高效且不易出错。
  • writerow()用于写入单行,writerows()用于写入多行,传入的必须是列表/元组这类元素集合,而非字符串。
  • pandas的to_csv是处理CSV文件的简便方式,推荐优先使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:01:35