提取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
相关产品推荐
相关产品推荐

