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

Python解析CSV时转义字符致字段解析异常的解决办法咨询

CSV解析问题解决方案

问题描述

原始CSV行内容:

Value1|Due Date: 01/01/2000  \|||Value5

期望解析后得到5个字段:

FieldName1|FieldName2             |FieldName3|Fieldname4|FieldName5
Value1    |Due Date: 01/01/2000   |          |          |Value5

当前使用以下代码读取时,解析结果不符合预期:

reader = csv.reader(infile, delimiter = '|', doublequote = False, escapechar = '\\')
writer = csv.writer(outfile, delimiter = '|', quoting = csv.QUOTE_ALL)

实际解析出4个字段,第二个字段被错误包含了|,且丢失了空字段FieldName3。

解决思路与方案

方案1:读取前移除多余的反斜杠

从需求来看,数据中的\|应该是误加的转义符,直接移除所有反斜杠后再交给csv.reader处理,就能得到正确的5个字段:

import csv

with open("input.csv", "r") as infile, open("output.csv", "w", newline="") as outfile:
    # 预处理每行,去掉所有反斜杠
    processed_lines = (line.replace("\\", "") for line in infile)
    reader = csv.reader(processed_lines, delimiter="|")
    writer = csv.writer(outfile, delimiter="|", quoting=csv.QUOTE_ALL)
    
    # 写入表头
    writer.writerow(["FieldName1", "FieldName2", "FieldName3", "Fieldname4", "FieldName5"])
    # 处理每行数据,确保字段数为5
    for row in reader:
        # 补全缺失的空字段
        while len(row) < 5:
            row.append("")
        writer.writerow(row)

方案2:自定义解析逻辑(保留反斜杠但修正字段)

如果需要保留数据中的其他反斜杠,仅处理这个特殊的\|场景,可以手动解析每行,排除转义的分隔符后再修正第二个字段:

import csv

with open("input.csv", "r") as infile, open("output.csv", "w", newline="") as outfile:
    writer = csv.writer(outfile, delimiter="|", quoting=csv.QUOTE_ALL)
    writer.writerow(["FieldName1", "FieldName2", "FieldName3", "Fieldname4", "FieldName5"])
    
    for line in infile:
        line = line.strip()
        parts = []
        current_part = []
        escape_flag = False
        
        # 逐字符解析,处理转义逻辑
        for char in line:
            if escape_flag:
                current_part.append(char)
                escape_flag = False
            elif char == "\\":
                escape_flag = True
            elif char == "|":
                parts.append("".join(current_part))
                current_part = []
            else:
                current_part.append(char)
        parts.append("".join(current_part))
        
        # 补全5个字段,修正第二个字段末尾的|
        while len(parts) < 5:
            parts.append("")
        parts[1] = parts[1].rstrip("|")  # 去掉字段末尾多余的|
        
        writer.writerow(parts)

方案3:调整CSV reader参数(不推荐)

如果去掉escapechar参数,csv.reader会把反斜杠当成普通字符,但这样第二个字段会保留\|内容,不符合你的期望,所以仅当数据中没有真实转义需求时才考虑:

reader = csv.reader(infile, delimiter='|', doublequote=False, quoting=csv.QUOTE_NONE)

之后需要手动修正第二个字段的内容。

内容的提问来源于stack exchange,提问作者Lili Mal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:40:49