如何提取并合并大CSV的指定行范围?优化全量合并逻辑
解决方案
完全可行,而且可以做到不加载全量CSV文件,只读取你需要的行范围,大幅节省内存和处理时间。以下是优化后的代码,分两种场景适配:
场景1:CSV包含表头(第一行为列名)
如果你的CSV第一行是表头,且需要提取的是数据行的0-20行、70-80行(不含表头),用这个版本:
import pandas as pd import os def get_selected_merged_blocks(): os.chdir("C:/Users/DD/Desktop/TM/Simulations/1-2") # 初始化两个行块的合并结果 block_0_20 = pd.DataFrame() block_70_80 = pd.DataFrame() for file in os.listdir(): if file.endswith('.csv'): # 读取表头(仅第一行) header = pd.read_csv(file, nrows=0) # 读取数据行0-20:跳过表头,读取21行数据 part_0_20 = pd.read_csv(file, skiprows=1, nrows=21, header=None) part_0_20.columns = header.columns # 读取数据行70-80:跳过表头+前70行数据,读取11行数据 part_70_80 = pd.read_csv(file, skiprows=71, nrows=11, header=None) part_70_80.columns = header.columns # 横向合并当前CSV的行块到总结果 block_0_20 = pd.concat([block_0_20, part_0_20], axis=1) block_70_80 = pd.concat([block_70_80, part_70_80], axis=1) # 在两个块之间插入空行 empty_row = pd.DataFrame([[pd.NA]*len(block_0_20.columns)], columns=block_0_20.columns) final_result = pd.concat([block_0_20, empty_row, block_70_80], axis=0, ignore_index=True) return final_result # 生成结果文件 final_df = get_selected_merged_blocks() final_df.to_csv("merged_selected_rows.csv", index=False)
场景2:CSV无表头(所有行都是数据)
如果你的CSV没有表头,直接提取文件行的0-20行、70-80行,用这个版本:
import pandas as pd import os def get_selected_merged_blocks(): os.chdir("C:/Users/DD/Desktop/TM/Simulations/1-2") block_0_20 = pd.DataFrame() block_70_80 = pd.DataFrame() for file in os.listdir(): if file.endswith('.csv'): # 读取0-20行(共21行) part_0_20 = pd.read_csv(file, nrows=21, header=None) # 读取70-80行:跳过前70行,读取11行 part_70_80 = pd.read_csv(file, skiprows=range(0,70), nrows=11, header=None) block_0_20 = pd.concat([block_0_20, part_0_20], axis=1) block_70_80 = pd.concat([block_70_80, part_70_80], axis=1) # 插入空行 empty_row = pd.DataFrame([[pd.NA]*len(block_0_20.columns)], columns=block_0_20.columns) final_result = pd.concat([block_0_20, empty_row, block_70_80], axis=0, ignore_index=True) return final_result final_df = get_selected_merged_blocks() final_df.to_csv("merged_selected_rows.csv", index=False)
核心优势
- 内存友好:每个CSV仅读取几十行,完全不用加载100万行的全量数据
- 高效快速:避免了大文件的IO和内存开销,处理速度大幅提升
- 精准控制:严格提取指定行范围,且自动在两组行之间插入空行
内容的提问来源于stack exchange,提问作者helloitsmontie
相关产品推荐
相关产品推荐

