Python CSV Writer代码错误在字符间加分隔符而非字符串的问题
解决CSV写入时字符被拆分或整行成一列的问题
嘿,我一眼就看出问题出在哪了——你把csv.writer的用法搞反啦!
你现在的问题根源在于:
- 当你调用
write.writerow(line)时,line是一个字符串,writerow会把字符串当成可迭代对象,逐个字符拆分,所以每个字符都被逗号隔开,就出现了那种乱糟糟的输出。 - 改成
write.writerow([line])后,整个字符串被当成了单个元素,自然Excel里只显示1列。
正确的做法其实超简单:
根本不需要手动用','.join(r)拼接字符串!直接把你组装好的列表r传给writerow()就行。csv.writer会自动帮你用指定的分隔符(这里是逗号)把列表里的每个元素对应到CSV的一列,完美符合你的需求。
修正后的完整代码:
import csv def csv_reader(file, path): with open(path, 'w') as f1, open(file, 'r') as f2: write = csv.writer(f1, delimiter=',') # 注意这里的reader配置,确保正确读取制表符分隔的输入 read = csv.reader((line.replace('\0','') for line in f2), delimiter="\t") i = 1 for row in read: if len(row) == 0: continue if row[3] == "Trade": continue else: if row[6] == "": r = [row[0], row[0], 'A', row[8], row[9], row[0]] print(','.join(r)) # 打印可以保留拼接后的结果看效果 write.writerow(r) # 直接传入列表r else: r = [row[0], row[0], 'B', row[6], row[7], row[0]] print(','.join(r)) write.writerow(r) # 直接传入列表r if __name__ == "__main__": path = "sales.csv" csv_path = "FlowEdge-TRTH-Time_Sales.csv" csv_reader(csv_path, path)
为什么这样能行?
writerow()的设计就是接收一个元素序列(比如列表),序列里的每个元素对应CSV的一列。你之前手动拼接成字符串,反而让writerow把字符串拆成了单个字符的序列,完全违背了它的用法。直接传列表,每个元素会被正确识别为一列,Excel打开后就能看到你想要的6列结果啦。
内容的提问来源于stack exchange,提问作者abhihacker02
相关产品推荐
相关产品推荐

