Python CSV Writer保留转义字符问题:截断C4列后转义丢失
CSV截断C4列并保留原始转义格式解决方案
问题场景
现有CSV文件片段如下:
c1,c2,c3,c4,c5 17939,2507974,11,DVD version has 1 hour of extras of 5 bonus matches including: - Stacy Keibler vs Torrie Wilson in a bikini contest. - A tour of Trish Stratus\' place. - Behind the scenes look at the WWE women division.,NULL 16641,2425413,11,"The Australian TV version had a scene included at the end where a cop car was driving in an alley way, narrowly missing someone walking. This scene was also used in the 1980 film, \"Alligator\".",NULL 127472,2130098,13,"FACT: Dunn uploads a file from an Apple Powerbook in \"C:\\\", which would be appropriate for a DOS/Windows system.",NULL
需要实现:将第4列(C4)截断至最大长度(如500字符),其余列和未超长的C4列完全保留原始格式(包括转义字符、引号),输出为新CSV文件。
当前代码存在两个问题:
- 转义字符丢失(如原反斜杠消失)
- 使用
quoting=csv.QUOTE_ALL会强制给所有列加引号,破坏原始短行的格式
解决思路
核心是区分处理两类行:
- 未超长的行:直接写入原始文本,完全保留原有格式
- 需要截断的行:先解析为CSV行对象,修改C4列后用CSV规范重新生成行内容,确保转义正确
代码实现
import csv INPUT_PATH = "old_file_name.csv" OUTPUT_PATH = "new_file_name.csv" MAX_C4_LENGTH = 500 # 读取所有原始行 with open(INPUT_PATH, 'r', newline='') as infile: all_lines = infile.readlines() with open(OUTPUT_PATH, 'w', newline='') as outfile: # 初始化CSV写入器,使用与原文件一致的分隔符、引号、转义符 csv_writer = csv.writer( outfile, delimiter=',', quotechar='"', escapechar='\\', quoting=csv.QUOTE_MINIMAL # 仅在必要时加引号,贴近原始格式 ) # 处理表头 header_row = next(csv.reader([all_lines[0]], delimiter=',', quotechar='"', escapechar='\\')) csv_writer.writerow(header_row) # 处理数据行 for line in all_lines[1:]: # 解析当前行为CSV行对象 row = next(csv.reader([line], delimiter=',', quotechar='"', escapechar='\\')) # 检查C4列长度(解析后的实际字符数) if len(row[3]) > MAX_C4_LENGTH: # 截断C4列 row[3] = row[3][:MAX_C4_LENGTH] # 用写入器生成符合规范的行 csv_writer.writerow(row) else: # 未超长,直接写入原始行,保留原始格式 outfile.write(line)
说明
- 对于未超长的行,直接写入原始文本,完全保留原有的转义、引号格式,不会被CSV写入器修改
- 对于超长行,解析后截断C4列,再通过CSV写入器生成符合规范的内容,确保截断后的文本转义正确,不会丢失必要的格式
- 使用
csv.QUOTE_MINIMAL参数,仅在内容包含分隔符、引号等特殊字符时才添加引号,尽可能贴近原始文件的格式风格
内容的提问来源于stack exchange,提问作者Polaris
相关产品推荐
相关产品推荐

