按指定记录数拆分CSV文件并保留表头至每个子文件
解决CSV拆分时保留表头的问题
我懂你遇到的麻烦——之前的代码只按行拆分却没保留表头,确实让人头疼。其实核心思路很简单:先把原文件的表头单独提取出来,再给每个生成的子CSV文件都先写入这行表头,再填充对应的数据就行。
下面给你几个实用的解决方案,你可以根据自己的需求选择:
方案1:用Python标准csv模块(适合超大文件,内存友好)
这个方法不需要额外安装库,而且能高效处理GB级别的CSV(不需要一次性加载所有数据到内存):
import csv def split_csv_with_header(input_file, rows_per_data_chunk=4): # 打开原文件,读取表头 with open(input_file, 'r', newline='', encoding='utf-8') as infile: reader = csv.reader(infile) header = next(reader) # 取出第一行作为表头 current_data_rows = [] file_counter = 1 # 逐行处理数据,避免占用过多内存 for row in reader: current_data_rows.append(row) # 当数据行达到指定数量时,写入子文件 if len(current_data_rows) == rows_per_data_chunk: write_chunk_to_csv(header, current_data_rows, file_counter) current_data_rows = [] file_counter += 1 # 处理最后一批不足指定行数的数据,保证无记录丢失 if current_data_rows: write_chunk_to_csv(header, current_data_rows, file_counter) def write_chunk_to_csv(header, data_rows, file_num): """辅助函数:将表头和数据写入指定子文件""" output_filename = f'data_{file_num}.csv' with open(output_filename, 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) writer.writerow(header) # 先写入表头 writer.writerows(data_rows) # 再写入数据行 # 调用函数:替换成你的CSV文件名,此处设置为每4条数据行拆分(对应示例中每个子文件含5条记录:表头+4条数据) split_csv_with_header('your_large_file.csv', rows_per_data_chunk=4)
代码说明:
next(reader)专门提取原文件第一行作为表头,确保所有子文件都能复用这行内容。- 逐行读取数据,攒够指定数量就写入子文件,不会一次性加载整个大文件,内存占用极低。
- 最后会自动处理剩余的不足指定行数的数据,保证没有任何记录丢失。
方案2:用Pandas(代码更简洁,适合中小文件)
如果你已经安装了Pandas,这个方案代码更短,可读性更高:
import pandas as pd def split_csv_pandas(input_file, rows_per_data_chunk=4): # 读取原CSV到DataFrame,自动识别表头 df = pd.read_csv(input_file) # 计算需要拆分的总份数 total_chunks = (len(df) + rows_per_data_chunk - 1) // rows_per_data_chunk for chunk_idx in range(total_chunks): # 切片获取当前块的数据 start_row = chunk_idx * rows_per_data_chunk end_row = start_row + rows_per_data_chunk chunk_df = df.iloc[start_row:end_row] # 保存为子CSV,index=False避免写入额外的索引列 chunk_df.to_csv(f'data_{chunk_idx + 1}.csv', index=False) # 调用函数 split_csv_pandas('your_large_file.csv', rows_per_data_chunk=4)
代码说明:
- Pandas的
read_csv会自动把原文件第一行作为列名(即表头)。 - 用
iloc切片拆分数据,to_csv保存时会自动把列名写入每个子文件的第一行,完美保留表头。 - 这个方案代码简洁,但如果CSV文件特别大,会占用较多内存,更适合中小规模的文件。
适配你的示例场景
针对你给出的示例文件,用上面的代码(设置rows_per_data_chunk=4):
data_1.csv会包含表头 + 前4条数据行(总共5条记录),完全符合你的要求。data_2.csv会包含表头 + 后4条数据行,所有记录都不会丢失。
内容的提问来源于stack exchange,提问作者Yelena
相关产品推荐
相关产品推荐

