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
相关产品推荐
相关产品推荐

