如何使用Python multiprocessing加速Excel读取实现多文件合并
多进程并行读取合并Excel实现方案
核心注意事项
新手使用multiprocessing跑不通90%是踩了以下几个坑:
- Windows系统下Python多进程默认采用
spawn启动模式,所有多进程执行逻辑必须放在if __name__ == "__main__":代码块内,否则会触发子进程递归启动,直接报错或卡死 - 子进程只负责单文件读取、预处理这类无状态的任务,不要向子进程传递
ExcelWriter、队列实例这类无法序列化的对象,参数尽量用字符串、数字这类简单类型 - 单文件处理函数必须定义在顶层作用域,不能写在主代码块内部,否则无法被多进程序列化传递
- Windows路径中的反斜杠存在转义问题,路径字符串前加
r标记为原始字符串可避免路径识别错误
可直接运行的代码
先清理原代码中未使用的冗余导入,多进程逻辑采用进程池实现,逻辑清晰易维护:
import pandas as pd import multiprocessing as mp def read_single_excel(file_path): """子进程执行:单文件读取+列去重预处理""" df = pd.read_excel(file_path) df = df.loc[:, ~df.columns.duplicated()].copy() return df if __name__ == "__main__": # CSV转Excel逻辑 read_csv = pd.read_csv(r'Data\SampleCollectionID.csv') excel_writer = pd.ExcelWriter(r'Data\converted_CSV_file.xlsx') read_csv.to_excel(excel_writer, index=False) excel_writer.close() # 新版本pandas已废弃save()方法,用close()兼容性更好 # 多进程并行读取所有目标文件 filenames = [r'Data/converted_CSV_file.xlsx', r'Data/LabData.xlsx'] # 进程数不超过CPU核心数,文件数少时和文件数量保持一致即可 with mp.Pool(processes=min(len(filenames), mp.cpu_count())) as pool: df_list = pool.map(read_single_excel, filenames) # 主进程统一做横向拼接、输出结果 final_frame = pd.concat(df_list, axis=1) final_frame.to_excel('combinedData.xlsx', index=False)
补充说明
- 如果你要处理的Excel文件数量少于3个、单文件体积很小,不建议用多进程:多进程启动本身有固定开销,小任务下速度反而不如单进程循环读取;当文件数量多、单文件体积大时,并行读取的速度优势才会明显。
- 如果需要纵向按行合并,只需要把
pd.concat的axis=1改成axis=0即可。
内容的提问来源于stack exchange,提问作者João Pimenta
相关产品推荐
相关产品推荐

