使用csv.writer写入MySQL结果时,如何去除整行的多余引号包裹?
解决Python csv.writer写入MySQL结果时整行被引号包裹的问题
问题原因
你遇到的情况是因为fetchall()返回的每一行不是多元素的序列(元组/列表),而是一个包含逗号分隔内容的单个字符串。csv.writer会把这个单个字符串当成一个CSV字段,为了保留字段内的逗号,自动用引号包裹整行。
解决方法
方法一:修正MySQL Cursor的返回格式
确保你的MySQL游标使用默认返回类型,即每行返回一个包含多个字段的元组。如果之前修改过cursorclass参数(比如设置成返回字符串的类型),改回默认即可:
# 初始化游标时使用默认配置,不设置特殊cursorclass source_mysql_cursor = connection.cursor()
此时fetchall()会返回类似(('item1', 'item2', 'item3'), ...)的结构,直接用writerows(result_set)就能生成正确的CSV格式。
方法二:手动拆分每行字符串
如果无法修改游标返回格式,或者查询结果本身就是拼接好的字符串,需要手动拆分每行内容:
import csv datafile = csv.writer(open(filename, 'a', newline='')) result_set = source_mysql_cursor.fetchall() for row in result_set: # 假设每行是元组内的单个字符串,例如row为("item1,item2,item3",) split_fields = row[0].split(',') datafile.writerow(split_fields)
方法三:强制关闭CSV引号(慎用)
如果你的字段内容里没有逗号、引号等特殊字符,可以通过设置csv.writer的quoting参数强制关闭引号包裹,但仅适合场景简单的情况:
import csv datafile = csv.writer(open(filename, 'a', newline=''), quoting=csv.QUOTE_NONE, escapechar='') result_set = source_mysql_cursor.fetchall() datafile.writerows(result_set)
注意:如果字段内存在特殊字符,这种方法会导致CSV格式错误。
内容的提问来源于stack exchange,提问作者Pythonist
相关产品推荐
相关产品推荐

