Python读取含嵌套双引号的CSV,如何不修改文件修正解析结果?
解决CSV嵌套未转义双引号的解析问题
问题场景
现有test.csv文件内容如下:
"N";"INFO" "1";"<a href="www.google.it">www.google.it</a>"
使用以下Python代码读取:
import csv with open('test.csv', newline='') as csvfile: reader=csv.DictReader(csvfile, delimiter=';') for p in reader: print("%s %s" % (p['N'], p['INFO']))
当前输出出现解析异常:
1 <a href=www.google.it">www.google.it</a>"
期望输出仅移除字段首尾的包裹双引号,保留内部双引号及原始内容:
1 <a href="www.google.it">www.google.it</a>
解决方案
方法1:关闭自动引号解析+手动清理字段
由于CSV使用;作为分隔符,字段仅靠首尾双引号包裹,内部双引号未做转义,可关闭CSV解析器的自动引号处理逻辑,再手动去除每个字段首尾的双引号:
import csv with open('test.csv', newline='') as csvfile: reader = csv.DictReader(csvfile, delimiter=';', quoting=csv.QUOTE_NONE) for p in reader: cleaned_n = p['N'].strip('"') cleaned_info = p['INFO'].strip('"') print(f"{cleaned_n} {cleaned_info}")
方法2:自定义字段清理函数
如果需要更灵活的字段处理逻辑(比如兼容部分未用双引号包裹的字段),可以编写清理函数批量处理:
import csv def clean_field(value): return value.strip('"') if value.startswith('"') and value.endswith('"') else value with open('test.csv', newline='') as csvfile: reader = csv.DictReader(csvfile, delimiter=';') for p in reader: cleaned_data = {k: clean_field(v) for k, v in p.items()} print(f"{cleaned_data['N']} {cleaned_data['INFO']}")
方法3:指定转义字符(兼容场景有限)
如果CSV的格式可以被识别为内部双引号属于未正确转义的情况,可尝试设置escapechar参数,但该方法对格式兼容性要求较高,仅推荐在特定场景使用:
import csv with open('test.csv', newline='') as csvfile: reader = csv.DictReader(csvfile, delimiter=';', escapechar='"') for p in reader: print(f"{p['N']} {p['INFO']}")
内容的提问来源于stack exchange,提问作者francesco
相关产品推荐
相关产品推荐

