如何解决pandas读取CSV文件时的分隔符字段不匹配错误?
解决Pandas读取CSV时字段数不匹配的问题
这个问题在处理非标准化CSV文件时太常见了——当文件里有的行字段数不一致,pandas的read_csv就会抛出字段数不匹配的错误。下面给你几个实用的解决方案,你可以根据自己的需求选择:
1. 直接跳过有问题的行
如果那些字段数异常的行对你的分析影响不大,最简单的办法就是直接跳过它们。在新版本的pandas里(2.0+),用on_bad_lines='skip'参数即可:
import pandas as pd df = pd.read_csv("oktober.csv", header=None, skiprows=2, engine='python', sep=';', on_bad_lines='skip')
如果你用的是旧版pandas,对应的参数是error_bad_lines=False,不过这个参数已经被弃用了,建议升级pandas或者使用新参数。
2. 跳过错误行并收到警告
如果你想知道哪些行出了问题,方便后续排查,可以用on_bad_lines='warn',这样pandas会跳过错误行,同时在控制台输出警告信息,告诉你具体是哪一行出了问题:
df = pd.read_csv("oktober.csv", header=None, skiprows=2, engine='python', sep=';', on_bad_lines='warn')
3. 保留所有行,用最大字段数读取
如果不想丢失任何数据,我们可以先统计文件里的最大字段数,然后创建足够多的列来容纳所有行的数据,字段数少的行后面的列会自动填充NaN,之后你可以再处理这些空值:
import pandas as pd # 第一步:先遍历文件,找到最大的字段数 max_column_count = 0 with open("oktober.csv", 'r', encoding='utf-8') as file: # 跳过前2行 for _ in range(2): next(file) for line in file: # 按分号拆分当前行,统计字段数 current_col_count = len(line.strip().split(';')) if current_col_count > max_column_count: max_column_count = current_col_count # 第二步:用最大字段数创建列名,读取文件 df = pd.read_csv( "oktober.csv", header=None, skiprows=2, engine='python', sep=';', # 创建对应数量的列名,比如column_0, column_1...column_n names=[f"column_{i}" for i in range(max_column_count)] )
读取完成后,你可以根据实际情况处理NaN,比如把多出来的字段合并到最后一列,或者删除无用的空列。
4. 检查是否是未转义的分隔符导致的错误
有时候字段数不匹配并不是真的行结构不一致,而是某个字段值里包含了分号,但没有用引号包裹,导致pandas错误地拆分了字段。这种情况下,你可以尝试设置quoting参数,让pandas识别引号包裹的字段:
import pandas as pd import csv df = pd.read_csv( "oktober.csv", header=None, skiprows=2, engine='python', sep=';', # 让pandas识别所有被引号包裹的字段 quoting=csv.QUOTE_ALL )
如果你的文件里只有部分字段用引号包裹,也可以试试quoting=csv.QUOTE_MINIMAL,这个参数会只识别包含特殊字符(比如分隔符、换行符)的字段。
内容的提问来源于stack exchange,提问作者Matija




