CSV文件写入异常:文本拆分多列,期望仅两列的技术求助
解决CSV写入时文本被拆分到多列的问题
看起来你遇到的核心问题有两个:错误使用了pickle来写入CSV文本,以及手动拼接CSV行时没有处理文本中的特殊字符,这才导致text内容被拆分成多个列。让我一步步帮你修正:
问题根源分析
- 误用pickle模块:
pickle.dump()是用来序列化Python对象的,不是用来写入普通文本文件的。用它写入的内容不是纯文本格式的CSV,后续解析肯定会出问题。 - 未处理CSV特殊字符:当你的
text中包含逗号、双引号或者换行符时,直接用label+" , "+text+"\n"拼接的字符串会破坏CSV的列结构——CSV会把text里的逗号当成新列的分隔符。
最佳解决方案:使用Python内置csv模块
Python的csv模块专门处理CSV文件的读写,会自动帮你处理特殊字符的转义(比如给包含逗号的字段套上双引号),完全避免列拆分的问题。
修改后的writeOutput方法如下:
import csv # 记得导入csv模块 def writeOutput(self, filename, writeOption='w', encoding='utf-8'): # 使用with语句自动管理文件,避免资源泄漏 with open(filename, writeOption, newline='', encoding=encoding) as fp: # 创建CSV写入器 writer = csv.writer(fp) # 可选:写入表头(如果需要的话) writer.writerow(['label', 'text']) # 遍历结果写入每一行 for i in self.results: res = self.results[i] for j in res: item = res[j] text = item['text'].strip() label = item['label'] # csv.writer会自动处理text中的逗号、引号等特殊字符 writer.writerow([label, text])
为什么这个方案有效?
csv.writer会自动检测字段中的特殊字符:如果text里包含逗号,它会自动把整个text字段用双引号包裹,这样后续解析CSV时就不会把text里的逗号当成列分隔符。- 使用
with语句打开文件,会在代码块结束后自动关闭文件,不用手动调用fp.close()。 - 指定编码为
utf-8可以避免中文或特殊字符出现乱码问题。 - 彻底移除了
pickle的使用,因为它完全不适合写入纯文本CSV。
如果你不想用csv模块(不推荐)
如果坚持手动拼接,需要自己处理特殊字符的转义,比如:
def escape_csv_field(s): # 如果字段包含逗号、双引号或换行,就用双引号包裹,并转义内部的双引号 if ',' in s or '"' in s or '\n' in s: s = s.replace('"', '""') return f'"{s}"' return s def writeOutput(self, filename, writeOption='w', encoding='utf-8'): with open(filename, writeOption, encoding=encoding) as fp: # 写入表头 fp.write('label,text\n') for i in self.results: res = self.results[i] for j in res: item = res[j] text = item['text'].strip() label = item['label'] # 转义text字段 escaped_text = escape_csv_field(text) writeStr = f"{label},{escaped_text}\n" fp.write(writeStr)
不过还是强烈推荐用csv模块,它能覆盖所有CSV规范的边界情况,比手动处理靠谱得多。
内容的提问来源于stack exchange,提问作者Sanky
相关产品推荐
相关产品推荐

