如何使用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)
关键说明
- 编码与分隔符:如果你的CSV用了非UTF-8编码(比如GBK)或非逗号分隔符,记得调整
encoding和sep参数; - 弃用参数注意:你之前用的
error_bad_lines已经被Pandas弃用,现在推荐用on_bad_lines='skip',但这个参数依然会跳过6000列的行(因为它们相对于前面2000列的列名是“坏行”),所以不适合你的需求; - 内存优化:如果文件特别大,方案一的
skiprows方式会更节省内存,因为不需要把整个文件加载到内存中。
内容的提问来源于stack exchange,提问作者swifty
相关产品推荐
相关产品推荐

