Pandas to_csv转义不一致:保留\N同时正确转义引号
解决Pandas导出CSV的引号转义与\N保留问题
要同时解决「字段内引号用\转义而非双写」和「\N不被转义为\N」的问题,直接用Python标准库的csv模块自定义写入逻辑即可,无需二次处理大文件,具体实现如下:
核心思路
- 关闭Pandas默认的双写引号规则,改用
\转义字段内的引号; - 精确控制转义范围:仅转义引号、分隔符和转义符本身,保留
\N中的反斜杠; - 通过
csv.writer直接写入数据,绕过Pandasto_csv的自动转义逻辑。
代码示例
假设已完成空值替换为\N、字段截断等预处理操作:
import pandas as pd import csv # 预处理后的DataFrame # df = df.fillna(r"\N") # 字段截断操作... # 导出配置 output_path = "result.csv" delimiter = "," # 替换为你的CSV分隔符 with open(output_path, "w", newline="", encoding="utf-8") as f: # 初始化写入器,配置转义和引号规则 writer = csv.writer( f, delimiter=delimiter, quotechar='"', escapechar="\\", doublequote=False, quoting=csv.QUOTE_NONNUMERIC # 仅给非数值字段加引号,需全字段加引号则改为csv.QUOTE_ALL ) # 写入列名 writer.writerow(df.columns.tolist()) # 逐行写入数据 for row in df.itertuples(index=False, name=None): row_data = [] for val in row: if pd.isna(val): row_data.append(r"\N") elif isinstance(val, (int, float)): row_data.append(val) # 保留数值类型,不转字符串 else: row_data.append(str(val)) writer.writerow(row_data)
参数说明
doublequote=False:关闭双写引号的默认行为,改用escapechar转义引号;escapechar="\\":指定用\作为转义字符,仅转义引号、分隔符和\本身;quoting=csv.QUOTE_NONNUMERIC:仅对非数值字段添加引号,避免数值被不必要的引号包裹。
内容的提问来源于stack exchange,提问作者enrico_steez
相关产品推荐
相关产品推荐

