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

如何将Pandas DataFrame写入CSV:字符串加双引号、数值/空单元格保持原样且不为逗号添加转义字符

如何将Pandas DataFrame写入CSV:字符串加双引号、数值/空单元格保持原样且不为逗号添加转义字符

看起来你遇到的问题是手动给字符串加引号后,和CSV writer的quoting参数冲突导致逗号被不必要地转义了。其实我们完全不需要手动给字符串加引号,应该让csv模块来负责处理引号逻辑,这样就能自然保留引号内的逗号,不用额外转义。

正确实现思路

核心是让pandas.to_csv自动为字符串列添加双引号,同时不对数值列应用引号,并且保留空单元格为空。我们可以通过csv.QUOTE_NONNUMERIC参数配合空值处理来实现你的全部需求。

修改后的代码

import pandas as pd
import csv

# Sample DataFrame
data = {'col1': ['hello, world', 'test', '', None], 'col2': [123, 456, 789, None]}
report_df = pd.DataFrame(data)

# 处理字符串/布尔列的空值:将None和空字符串转为空(确保输出为空单元格)
for col in report_df.select_dtypes(include=['object', 'bool']).columns:
    report_df[col] = report_df[col].apply(
        lambda x: x if pd.notnull(x) and str(x).strip() != "" else ""
    )

# 写入CSV:仅对非数值字段加引号,空值输出为空
report_df.to_csv(
    "output.csv",
    index=False,
    quoting=csv.QUOTE_NONNUMERIC,  # 给所有非数值字段自动加双引号
    quotechar='"',                 # 指定使用双引号作为包裹字符
    na_rep='',                     # 空值直接输出为空单元格
    escapechar=None                # 无需转义符,CSV规范允许引号内直接包含逗号
)

输出效果

运行后output.csv的内容完全符合你的期望:

"hello, world",123
"test",456
,789
,

为什么这个方法有效?

  1. 避免手动加引号的冲突:之前手动给字符串加引号后用QUOTE_NONE,会让CSV writer把引号内的逗号当作分隔符,从而自动转义。现在让CSV writer负责加引号,它会识别引号内的逗号是字段内容的一部分,不会添加转义符(完全符合CSV官方规范)。
  2. 精准控制引号范围:csv.QUOTE_NONNUMERIC会自动给所有非数值类型的字段加双引号,数值列则保持原样输出,完美匹配你的需求。
  3. 空值处理更干净:通过na_rep=''和提前的空值转换,确保空单元格直接输出为空,不会出现多余的""。

额外说明

如果你的DataFrame包含布尔类型列,csv.QUOTE_NONNUMERIC会将True/False当作非数值字段用双引号包裹。如果你希望布尔值输出为1/0,可以提前将布尔列转为整数:

for col in report_df.select_dtypes(include=['bool']).columns:
    report_df[col] = report_df[col].astype(int)

备注:内容来源于stack exchange,提问作者Aswany Mahendran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:45:29