使用pandas read_csv读取含嵌套引号CSV文件列数异常问题
解决pandas read_csv读取CSV时引号内逗号被误识别为分隔符的问题
你的CSV单行内容如下:
"Venta presencial",53232907737,"[{"was_pin":false,"pin_validation":"pin_not_validated","integration":"none","is_fallback":false}]"
使用默认代码df = pd.read_csv(filename,encoding='utf-8')读取时,第三列JSON内容里的逗号会被当成列分隔符,导致原本预期的3列变成6列。下面是几种解决方法:
方法1:修复CSV文件格式(优先推荐)
标准CSV规范中,字段内部的双引号需要用两个双引号转义。把第三列里的所有"替换为"",修改后的行内容如下:
"Venta presencial",53232907737,"[{""was_pin"":false,""pin_validation"":""pin_not_validated"",""integration"":""none"",""is_fallback"":false}]"
修改后直接用原代码读取,pandas会正确识别引号包裹的字段,忽略内部逗号,得到3列数据。
方法2:用正则表达式作为分隔符(无需修改原文件)
通过正则匹配不在成对双引号内的逗号作为分隔符,需要配合engine='python'使用:
import pandas as pd import re # 定义匹配规则:只匹配不在双引号内的逗号 sep_pattern = re.compile(r',(?=(?:[^"]*"[^"]*")*[^"]*$)') df = pd.read_csv(filename, encoding='utf-8', sep=sep_pattern, engine='python')
方法3:预处理CSV内容(处理不规范的引号)
如果无法修改原文件,可以先逐行处理,转义第三列内部的双引号,再读取:
import pandas as pd from io import StringIO processed_lines = [] with open(filename, 'r', encoding='utf-8') as f: for line in f: # 仅分割前两个逗号,拆分出三个字段的雏形 first_col, second_col, third_col = line.split(',', 2) # 转义第三列内的双引号 escaped_third = third_col.replace('"', '""').strip() # 重新拼接成标准CSV行 processed_lines.append(f'{first_col},{second_col},"{escaped_third}"') # 从处理后的内容读取DataFrame df = pd.read_csv(StringIO('\n'.join(processed_lines)), encoding='utf-8')
内容的提问来源于stack exchange,提问作者Seba Castelo
相关产品推荐
相关产品推荐

