Python按供应商拆分Excel文件效率低下,寻求优化方案
优化Excel按供应商拆分的高效实现
原代码的低效问题集中在重复IO操作、逐单元格写入和频繁保存几个关键节点,以下是针对性的优化方案:
核心优化点
- 避免重复加载空白工作簿:仅加载一次模板,通过复制模板文件创建新文件
- 替换逐单元格写入:用pandas批量写入接口替代手动循环赋值,大幅提升效率
- 减少保存次数:所有数据写入完成后仅执行一次保存操作
- 确保输出目录存在:自动创建指定的目标文件夹,避免路径错误
优化后代码
import os import pandas as pd from shutil import copyfile # 定义输出目录并确保存在 output_dir = os.path.expanduser("~/Downloads/VendorSplittingApp") os.makedirs(output_dir, exist_ok=True) # 按供应商分组处理(比先取唯一值再筛选更高效) for supplier, supplier_df in df.groupby('Vendor Name'): if not isinstance(supplier, str): continue # 处理文件名中的非法字符 safe_supplier = supplier.replace('/', '_') output_path = os.path.join(output_dir, f"{safe_supplier}.xlsx") # 复制空白工作簿模板,避免修改原文件 copyfile(blank_order_book_path, output_path) # 用pandas批量写入数据到指定工作表 with pd.ExcelWriter(output_path, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer: supplier_df.to_excel(writer, sheet_name="Data Dump", index=False) print(f"所有文件已保存到 {output_dir}")
优化细节说明
- 工作簿加载优化:原代码每次循环都重新读取磁盘加载空白工作簿,属于重复高开销IO操作。优化后通过复制模板文件创建新文件,仅在初始化时读取一次原模板。
- 数据写入优化:openpyxl逐单元格赋值是效率最低的写入方式,改用pandas的
to_excel接口,底层会优化批量写入逻辑,处理大数据集时速度提升明显。 - 保存操作优化:原代码每写入一个单元格就执行一次保存,频繁触发磁盘写入。优化后仅在当前供应商的所有数据写入完成后保存一次,减少磁盘IO次数。
- 分组逻辑优化:使用
df.groupby直接遍历分组,比先取唯一值再逐个筛选的逻辑更高效,pandas内部会对分组操作做性能优化。
内容的提问来源于stack exchange,提问作者HP's PPTs
相关产品推荐
相关产品推荐

