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

提取CSV文件price列时遇列数错误,求技术解决方案

嘿,这个「Wrong number of columns at line ##」错误大概率是因为你stock_csv100文件夹里的某个CSV文件存在格式问题——比如某一行的列数和表头不一致,可能是有空行、分隔符不对,或者数据行里不小心多了/少了逗号,甚至是数据里包含未加引号的逗号(比如某条文本字段带逗号)。我给你两个靠谱的解决办法:

解决方案1:用Pandas(最稳健,强烈推荐)

Pandas对CSV的格式容错性比Numpy好太多,代码也更简洁,能轻松跳过有问题的行,还能直接按列名提取数据(不用依赖列的位置):

import pandas as pd
import glob
import os

# 获取文件夹内所有CSV文件的路径
filenames = glob.glob('stock_csv100/*.csv')

for file_path in filenames:
    # 只读取price列,自动跳过列数不匹配的行
    df = pd.read_csv(file_path, usecols=['price'], on_bad_lines='skip')
    
    # 生成新文件名(比如原文件是Dialog_stock100.csv,新文件为Dialog_stock100_price.csv)
    file_name = os.path.basename(file_path)
    new_file_name = f"{os.path.splitext(file_name)[0]}_price.csv"
    new_file_path = os.path.join('stock_csv100', new_file_name)
    
    # 保存新CSV,不保留索引列
    df.to_csv(new_file_path, index=False)

这里的usecols=['price']会直接定位到目标列,不用纠结它是第几列;on_bad_lines='skip'参数会自动跳过格式错误的行,彻底避免列数不匹配的报错。

解决方案2:用Numpy处理(兼容你的原代码思路)

如果你不想引入Pandas,也可以在读取时加入异常处理,手动过滤掉有问题的行:

import numpy as np
import glob
import os

filenames = glob.glob('stock_csv100/*.csv')

for file_path in filenames:
    valid_rows = []
    with open(file_path, 'r', encoding='utf-8') as f:
        # 读取表头,找到price列的索引(不依赖固定列位置)
        header = f.readline().strip().split(',')
        price_col_idx = header.index('price')
        valid_rows.append(['price'])  # 新文件的表头
        
        # 逐行读取并校验格式
        for line_num, line in enumerate(f, start=2):
            line = line.strip()
            if not line:  # 跳过空行
                continue
            parts = line.split(',')
            if len(parts) == len(header):  # 列数和表头一致才保留
                valid_rows.append([parts[price_col_idx]])
            else:
                print(f"⚠️ 跳过文件 {file_path} 的第 {line_num} 行:列数不匹配")
    
    # 转换为数组并保存
    price_data = np.array(valid_rows)
    file_name = os.path.basename(file_path)
    new_file_path = os.path.join('stock_csv100', f"{os.path.splitext(file_name)[0]}_price.csv")
    np.savetxt(new_file_path, price_data, delimiter=',', fmt='%s')

这个方法会逐行检查列数,只保留符合要求的行,同时打印异常行的信息,方便你排查具体是哪个文件的哪一行出了问题。

另外,你可以先根据报错提示的行号,打开对应的CSV文件看看具体问题——比如是不是行尾多了逗号,或者某条数据里的文本包含逗号但没加双引号,这种情况用Pandas的方案会自动处理带引号的字段,更省心。

内容的提问来源于stack exchange,提问作者Dushan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:01:22