使用Pandas读取多分隔符CSV遭遇ParserError的解决咨询
嘿,你遇到这个报错太典型了!核心原因就是:当你用正则表达式作为多字符分隔符(这里的', |;'匹配逗号+空格或分号)时,Pandas的Python引擎会直接忽略引号的存在——原本被引号包裹、里面带分隔符的字段会被错误拆分,导致第61行的实际字段数(14个)和预期的13个对不上,触发了ParserError。
下面给你几个好用的解决方案,按靠谱程度排序:
方法1:用Python内置csv模块先处理,再转成DataFrame
Pandas的read_csv在多分隔符+引号的场景下确实有点拉胯,但Python自带的csv模块对这种情况处理得更精准。我们可以自定义一个读取逻辑,让它同时识别逗号和分号,还能正确识别引号包裹的字段:
import pandas as pd import re def read_multi_delim_csv(file_path): with open(file_path, 'r', encoding='utf-8') as f: # 先读表头,按规则分割列名 header = next(f).strip() columns = re.split(r'(?<!["\w]),|;(?!["\w])', header) # 处理每一行数据 rows = [] for line in f: stripped_line = line.strip() if not stripped_line: continue # 分割行,跳过引号内的分隔符 row = re.split(r'(?<!["\w]),|;(?!["\w])', stripped_line) # 清理字段的引号和多余空格 cleaned_row = [field.strip('" ').strip("' ") for field in row] rows.append(cleaned_row) return pd.DataFrame(rows, columns=columns) # 调用函数读取文件 df = read_multi_delim_csv("TT.csv")
这里用的正则(?<!["\w]),|;(?!["\w])是关键:它只会匹配前面不是引号/字母数字的逗号,或者后面不是引号/字母数字的分号,完美避开引号里的分隔符,不会拆错字段。
方法2:调整Pandas参数(适合简单场景)
如果你的CSV里引号用得很标准(没有转义的引号),可以直接调整read_csv的参数,让它正确处理引号:
import pandas as pd import csv df = pd.read_csv( "TT.csv", sep=r'(?<!")[,;](?!")', # 只匹配不在引号内的逗号/分号 engine='python', quoting=csv.QUOTE_MINIMAL, # 告诉引擎处理带引号的字段 skipinitialspace=True # 自动跳过分隔符后面的空格 )
要是你的所有字段都被引号包裹,就把quoting=csv.QUOTE_MINIMAL换成csv.QUOTE_ALL就行。不过这个方法对有转义引号的复杂场景可能失效,不如方法1稳。
方法3:先预处理CSV文件(适合结构简单的情况)
如果你的CSV结构不复杂,没太多嵌套引号,也可以先把文件里的分号(不在引号内的)换成逗号,再用普通方式读取:
import re # 读取原文件内容 with open("TT.csv", 'r', encoding='utf-8') as f: content = f.read() # 替换不在引号内的分号为逗号 processed_content = re.sub(r';(?=(?:[^"]*"[^"]*")*[^"]*$)', ',', content) # 写入处理后的新文件 with open("TT_processed.csv", 'w', encoding='utf-8') as f: f.write(processed_content) # 读取处理后的文件 df = pd.read_csv("TT_processed.csv", sep=',', skipinitialspace=True)
这个正则的作用是:只替换那些后面跟着偶数个引号的分号——也就是不在引号里的分号,不会动引号内的内容。
最后提个小建议:可以先打开TT.csv看看第61行的内容,确认是不是某个字段被引号包裹但带了分隔符,导致原来的拆分逻辑出错。先定位问题行,再选方案会更高效哦!
内容的提问来源于stack exchange,提问作者Healthy Minimalist

