You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动