You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:33:20