Python csv.writer的escapechar与quoting参数处理及CSV替换问题
解决CSV写入时行被双引号包裹的问题
问题根源
csv.writer/csv.DictWriter默认会根据字段内容自动添加双引号:当字段包含逗号、换行符、引号这类特殊字符时,会触发自动加引号逻辑;如果你的代码里错误设置了quoting=csv.QUOTE_ALL,则会强制给所有字段套上双引号,这就是你遇到的问题核心。
解决方案
以下是几种针对不同场景的处理方式,均无需依赖pandas:
1. 完全禁用引号(适用于无特殊字符的CSV)
如果你的CSV内容里没有逗号、换行、引号这类特殊字符,可以直接关闭自动引号功能,同时指定转义符(防止意外出现特殊字符时报错):
import csv def replace_csv_columns(csv_path, target_cols, str_a, str_b): # 读取原CSV内容 rows = [] with open(csv_path, 'r', newline='', encoding='utf-8') as f: reader = csv.DictReader(f) fieldnames = reader.fieldnames for row in reader: # 执行指定列的字符串替换 for col in target_cols: if col in row: row[col] = row[col].replace(str_a, str_b) rows.append(row) # 写入修改后内容,禁用所有引号 with open(csv_path, 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter( f, fieldnames=fieldnames, quoting=csv.QUOTE_NONE, escapechar='\\' # 可选:如果有需要转义的字符,可指定 ) writer.writeheader() writer.writerows(rows)
2. 仅在必要时添加引号(默认行为优化)
如果只是不想让所有字段都被引号包裹,保持默认的csv.QUOTE_MINIMAL即可——它只会在字段包含特殊字符时才添加引号。如果你的代码之前用了csv.QUOTE_ALL,改成这个参数就能解决问题:
# 写入部分的代码修改 writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_MINIMAL)
3. 仅给非数字字段加引号
如果需要区分数字和非数字字段,可以使用csv.QUOTE_NONNUMERIC,只给字符串类型的字段添加引号:
writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_NONNUMERIC)
关键参数说明
csv.QUOTE_NONE:完全不添加引号,需配合escapechar处理特殊字符csv.QUOTE_MINIMAL:仅在字段包含逗号、换行、引号时加引号(默认规则)csv.QUOTE_ALL:强制给所有字段加引号(问题常见诱因)csv.QUOTE_NONNUMERIC:仅给非数字类型字段加引号
示例验证
假设原CSV内容:
name,age,address
Alice,25,123 Main St, Apt 4B
Bob,30,456 Oak Ave
替换address列中的,为-后,使用QUOTE_NONE输出:
name,age,address
Alice,25,123 Main St- Apt 4B
Bob,30,456 Oak Ave
内容的提问来源于stack exchange,提问作者Tms91
相关产品推荐
相关产品推荐

