Python读取CSV文件200行数据仅返回1行,如何排查解决?
问题排查方向
- 首先检查列表赋值逻辑:你初始化了
Test_X = [],但循环内拆分得到的tweet没有执行Test_X.append(tweet)操作,Test_X始终是空列表,后续处理逻辑只会拿到空值,不会处理多轮数据。 - 其次检查业务逻辑位置:你所有的清洗、预测、写文件代码都放在CSV读取的
for循环外部,整个程序只会执行一次预测和写文件操作,自然只会输出1行结果,不会遍历200行数据分别处理。 - 最后检查CSV分隔符配置:你同时使用了
csv.reader的delimiter='\t'参数和line[0].split(';')操作,要确认你的CSV实际分隔符:如果CSV本身就是分号分隔,直接把csv.reader的delimiter改成';'即可,不需要额外拆分。
修复方案
把所有单条数据的处理逻辑挪到循环内部,同时把拆分后的数据存入列表,参考修复后的代码:
import csv # 提前打开输出文件避免重复IO操作 with open('Hasil Testing SVM.csv', 'a', newline='', encoding='utf-8') as f_svm, \ open('Hasil Testing NB.csv', 'a', newline='', encoding='utf-8') as f_nb: writer_svm = csv.writer(f_svm) writer_nb = csv.writer(f_nb) with open('data testing 2.csv', 'r', encoding="utf-8") as f: # 确认分隔符后可以删掉后续split操作 reader = csv.reader(f, delimiter=';') for i, line in enumerate(reader): # 如果CSV确实是先制表符分隔再分号分隔,保留下面这行,否则直接用line即可 # tweet = line[0].split(';') tweet = line # 单条数据处理逻辑移到循环内 cleaning2 = cleaning([tweet]) stemming2 = stemming(cleaning2) tokenizing2 = tokenizing(stemming2) stopwordremoval2 = stopwordremoval(tokenizing2) fit_sw2 = fit_sw(stopwordremoval2) count_vect2 = count_vect.transform([fit_sw2]) tf_idf2 = tf_idf.transform(count_vect2) hasilpred_svm = model_svm.predict(tf_idf2) writer_svm.writerow([fit_sw2, hasilpred_svm[0]]) hasilpred_nb = model_nb.predict(tf_idf2) writer_nb.writerow([fit_sw2, hasilpred_nb[0]])
额外优化建议
- 不要在循环内反复打开关闭输出文件,提前打开写入对象能大幅提升200行数据的处理效率
- 预测方法
predict返回的是数组,写入的时候取第一个元素hasilpred_svm[0]可以避免写入结果带括号 - 先打印前几行的
line变量确认CSV分隔符,避免两次拆分导致数据错位
内容的提问来源于stack exchange,提问作者ELS
相关产品推荐
相关产品推荐

