如何在csv.reader处理前预处理行,修复未转义的引号字段?
修复未转义内部双引号的CSV字段
这确实是个常见的CSV格式坑——CSV规范明确要求,被双引号包裹的字段内部如果出现双引号,必须用两个连续双引号来转义,但你的数据里刚好有个字段没遵守这个规则,导致csv.reader无法正确解析。
既然你确认仅存在一个这样的损坏字段,我们可以通过预处理每行文本,定位到这个字段的首尾双引号,转义其中间的所有单双引号,再交给csv.reader处理。下面是具体的实现代码:
import csv def fix_malformed_csv_line(line): # 定位该行中第一个和最后一个双引号的位置 first_quote = line.find('"') last_quote = line.rfind('"') # 确保找到的不是同一个双引号(即确实存在被包裹的字段) if first_quote != -1 and last_quote != -1 and first_quote != last_quote: # 提取字段内部的内容,将其中的单个双引号替换为两个(符合CSV转义规则) inner_content = line[first_quote+1:last_quote] fixed_inner = inner_content.replace('"', '""') # 重新拼接整行文本 return line[:first_quote+1] + fixed_inner + line[last_quote:] # 如果没有找到需要修复的字段,直接返回原行 return line # 使用示例 with open('your_file.csv', 'r', encoding='utf-8') as input_file: # 先预处理所有行,再传入csv.reader processed_lines = [fix_malformed_csv_line(line.strip('\n')) + '\n' for line in input_file] reader = csv.reader(processed_lines) for row in reader: print(row) # 现在可以正确解析出['1', 'something" like this', '20']
代码说明:
- 我们通过
find()和rfind()定位到损坏字段的首尾双引号,因为你说只有一个这样的字段,所以第一个和最后一个双引号之间的内容就是需要修复的部分。 - 把字段内部的单个双引号
"替换成两个双引号"",这完全符合CSV的转义规范,csv.reader就能正确识别这个字段了。 - 预处理完成后,再把修复后的行传给
csv.reader,就能正常解析每行数据。
如果之后遇到多个损坏字段的情况,可能需要用正则表达式来匹配所有被双引号包裹且内部包含未转义双引号的字段,但针对你当前的场景,上面的简单方法足够高效且准确。
内容的提问来源于stack exchange,提问作者Ninad Thakoor
相关产品推荐
相关产品推荐

