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
问题原因与解决方案
核心问题
- 字符串写入错误:你把
csv.reader读取的列表转成了字符串,writer.writerow()接收可迭代对象时,会把字符串的每个字符当作单独元素,导致每个字符被逗号分隔。 - 语法与逻辑错误:
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
相关产品推荐
相关产品推荐

