Csv Reader引号解析异常求助:JSON字符串被错误拆分
问题解决方法
问题根源
你遇到的问题是因为CSV字符串里的JSON字段采用了反斜杠\转义双引号,但这不符合CSV的标准转义规则——CSV中被双引号包裹的字段里,双引号应该用两个双引号""来转义。Python字符串里的\"会被解析成单个双引号,导致CSV解析器误将JSON内部的逗号当成字段分隔符,进而拆分了原本完整的JSON字符串。
修复方案
方案1:修正原始CSV字符串的转义格式
把字符串中的\"替换为"",遵循CSV标准转义规则,csv.reader默认的配置就能正确识别被包裹的JSON字段:
import csv from io import StringIO # 将\"替换为"",符合CSV标准转义逻辑 s = """url,forgeresponsetype,identifiers,metadata,partitionkey,sortkey,expirationdate,lastmodifieddate,redirectkey,siteid,locale,type,update_date https://www.expedia.com/Seattle-Hotels.d178307.Travel-Guide-Hotels,MOVED_PERMANENTLY,"{""filter"":""freeinternet"",""region"":""178307""}",,,HOTEL_DESTINATION_THEME.494647,1.en_US.filter:freeinternet.region:178307,1696746399,2023-06-18T06:26:40.521Z,,1,en_US,HOTEL_DESTINATION_THEME,21/06/23 https://www.expedia.com/Seattle-Hotels.d178307.Travel-Guide-Hotels,MOVED_PERMANENTLY,"{""filter"":""freeinternet"",""region"":""178307""}",,,HOTEL_DESTINATION_THEME.494647,1.en_US.filter:freeinternet.region:178307,1696746399,2023-06-18T06:26:40.521Z,,1,en_US,HOTEL_DESTINATION_THEME,21/06/23 https://www.expedia.com/Seattle-Hotels.d178307.Travel-Guide-Hotels,MOVED_PERMANENTLY,"{""filter"":""freeinternet"",""region"":""178307""}",,,HOTEL_DESTINATION_THEME.494647,1.en_US.filter:freeinternet.region:178307,1696746399,2023-06-18T06:26:40.521Z,,1,en_US,HOTEL_DESTINATION_THEME,21/06/23""" f = StringIO(s) reader = csv.reader(f, delimiter=',') xd = [row for row in reader] # 查看第一条数据的identifiers字段(索引为2) print(xd[1][2]) # 输出:{"filter":"freeinternet","region":"178307"}
方案2:无法修改原始字符串时的预处理逻辑
如果原始CSV数据固定使用反斜杠转义双引号,可以先对字符串做预处理,把\"替换为""后再交给csv.reader解析:
import csv from io import StringIO s = u"""url,forgeresponsetype,identifiers,metadata,partitionkey,sortkey,expirationdate,lastmodifieddate,redirectkey,siteid,locale,type,update_date https://www.expedia.com/Seattle-Hotels.d178307.Travel-Guide-Hotels,MOVED_PERMANENTLY,"{\"filter\":\"freeinternet\",\"region\":\"178307\"}",,,HOTEL_DESTINATION_THEME.494647,1.en_US.filter:freeinternet.region:178307,1696746399,2023-06-18T06:26:40.521Z,,1,en_US,HOTEL_DESTINATION_THEME,21/06/23 https://www.expedia.com/Seattle-Hotels.d178307.Travel-Guide-Hotels,MOVED_PERMANENTLY,"{\"filter\":\"freeinternet\",\"region\":\"178307\"}",,,HOTEL_DESTINATION_THEME.494647,1.en_US.filter:freeinternet.region:178307,1696746399,2023-06-18T06:26:40.521Z,,1,en_US,HOTEL_DESTINATION_THEME,21/06/23 https://www.expedia.com/Seattle-Hotels.d178307.Travel-Guide-Hotels,MOVED_PERMANENTLY,"{\"filter\":\"freeinternet\",\"region\":\"178307\"}",,,HOTEL_DESTINATION_THEME.494647,1.en_US.filter:freeinternet.region:178307,1696746399,2023-06-18T06:26:40.521Z,,1,en_US,HOTEL_DESTINATION_THEME,21/06/23""" # 预处理:转换CSV转义规则 processed_s = s.replace('\\"', '""') f = StringIO(processed_s) reader = csv.reader(f, delimiter=',') xd = [row for row in reader] print(xd[1][2]) # 输出:{"filter":"freeinternet","region":"178307"}
验证结果
运行任意一种方案的代码后,identifiers字段都会完整保留原始JSON字符串,不会被拆分成多个字段。
内容的提问来源于stack exchange,提问作者Akshay Hazari
相关产品推荐
相关产品推荐

