You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas读取多分隔符CSV遭遇ParserError的解决咨询

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:34:06