Python写入CSV时如何实现空字符串带引号、NULL值不带引号
问题核心原因
Python内置csv模块的预设引号规则无法直接匹配需求:csv.QUOTE_NONNUMERIC会对所有非数值类型字段(包括Python中对应MySQL NULL的None值、空字符串)统一包裹引号,没有提供单独区分空值和空字符串的配置项。
可行实现方案
通过手动控制字段引号包裹逻辑,搭配QUOTE_NONE规则关闭writer自动加引号的行为,就能精确实现两类值的差异化输出。
具体实现代码
import csv from typing import Any def process_field(value: Any) -> Any: # 对应MySQL NULL的None值:返回无引号空内容 if value is None: return "" # 所有字符串类型(包括空字符串):按CSV规范转义后主动包裹双引号 if isinstance(value, str): escaped_val = value.replace('"', '""') return f'"{escaped_val}"' # 数值类型直接返回,不包裹引号 return value # 写入CSV示例 if __name__ == "__main__": # 替换为你从MySQL查询到的结果集 mysql_rows = [ (1, None, "", "普通文本", 12.5), (2, "", None, "带\"双引号的文本", 0) ] with open("result.csv", "w", newline="", encoding="utf-8") as f: # 关闭自动加引号逻辑,指定转义字符避免格式错误 writer = csv.writer(f, quoting=csv.QUOTE_NONE, escapechar="\\") for row in mysql_rows: writer.writerow([process_field(field) for field in row])
输出效果
上述测试数据写入后的CSV内容如下,完全符合预期:
1,,"","普通文本",12.5 2,"",,"带""双引号的文本",0
可以看到:
- MySQL NULL对应的
None值输出为两个逗号间的无引号空内容 - 空字符串输出为带双引号的
"" - 普通字符串、数值的输出格式也符合
QUOTE_NONNUMERIC的常规要求 - 字符串内的双引号会按CSV标准自动转义,不会出现列错位问题
注意事项
- 从MySQL读取数据时不要提前将
None值转换为空字符串,否则会丢失类型判断依据,无法区分NULL和真实空串 - 如果使用pandas的
to_csv方法,逻辑完全一致:配置quoting=csv.QUOTE_NONE,提前对DataFrame中的字符串列做主动引号包裹、将空值(pd.NA/None)替换为无引号空值即可。
内容的提问来源于stack exchange,提问作者Varun Suresh
相关产品推荐
相关产品推荐

