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

如何使用Pandas读取CSV文件中列数为6000的行?

解决方法:只保留CSV文件中6000列的行

你的问题核心在于Pandas默认会把文件第一行当作列名,导致后面6000列的行因列数不匹配被判定为“坏行”。要反过来保留6000列的行、丢弃2000列的部分,我们可以通过定位6000列数据的起始位置来实现,这里提供两种高效的方案:

方案一:快速定位起始行后批量读取(推荐)

这个方法先遍历文件找到6000列数据的起始行,再直接读取后续内容,内存效率更高:

import pandas as pd
import csv

def find_6000_col_start(file_path, sep=','):
    """找到6000列数据的起始行号"""
    with open(file_path, 'r', newline='', encoding='utf-8') as f:
        reader = csv.reader(f, delimiter=sep)
        target_col_count = 6000
        for row_idx, row in enumerate(reader):
            if len(row) == target_col_count:
                return row_idx
    return None  # 如果没找到6000列的行,返回空

def read_6000_col_data(file_path, sep=','):
    """只读取文件中6000列的部分"""
    start_row = find_6000_col_start(file_path, sep)
    if start_row is None:
        return pd.DataFrame()
    
    # 从起始行开始读取,将该行作为列名
    df = pd.read_csv(
        file_path,
        skiprows=start_row,
        index_col='Unnamed: 0',
        sep=sep
    )
    return df

# 处理所有文件并合并
file_list = ['your_file1.csv', 'your_file2.csv']
dfs = [read_6000_col_data(f) for f in file_list]
final_df = pd.concat(dfs)

方案二:逐行过滤后加载(兼容异常行)

如果6000列的部分中间可能夹杂少量非6000列的异常行,可以用这个方法逐行过滤:

import pandas as pd
import csv

def filter_6000_col_rows(file_path, sep=','):
    """过滤出所有6000列的行"""
    with open(file_path, 'r', newline='', encoding='utf-8') as f:
        reader = csv.reader(f, delimiter=sep)
        target_col_count = 6000
        valid_rows = []
        # 一旦找到6000列的行,开始收集后续所有符合条件的行
        start_collecting = False
        
        for row in reader:
            if len(row) == target_col_count:
                start_collecting = True
                valid_rows.append(row)
            elif start_collecting:
                # 已开始收集后遇到的异常行直接跳过
                continue
    
    if not valid_rows:
        return pd.DataFrame()
    
    # 第一行作为列名,剩余行作为数据
    df = pd.DataFrame(data=valid_rows[1:], columns=valid_rows[0])
    if 'Unnamed: 0' in df.columns:
        df = df.set_index('Unnamed: 0')
    return df

# 合并文件
file_list = ['your_file1.csv', 'your_file2.csv']
dfs = [filter_6000_col_rows(f) for f in file_list]
final_df = pd.concat(dfs)

关键说明

  1. 编码与分隔符:如果你的CSV用了非UTF-8编码(比如GBK)或非逗号分隔符,记得调整encoding和sep参数;
  2. 弃用参数注意:你之前用的error_bad_lines已经被Pandas弃用,现在推荐用on_bad_lines='skip',但这个参数依然会跳过6000列的行(因为它们相对于前面2000列的列名是“坏行”),所以不适合你的需求;
  3. 内存优化:如果文件特别大,方案一的skiprows方式会更节省内存,因为不需要把整个文件加载到内存中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:01:58