复制文件1,按供应商拆分文件2,粘贴拆分数据到复制文件1

1 投票
1 回答
54 浏览
提问于 2025-04-14 17:46

问题描述:

我需要根据“供应商名称”这一列中的唯一值,把一个Excel文件(File2)拆分开来,并把每个部分保存为一个单独的文件,放在一个已经存在的Excel工作簿(File1)里。不过,我现在的做法效率不高,花了很多时间。

File1的路径是blank_order_book_path

File2的数据框是df

代码主要部分:

suppliers = df['Vendor Name'].unique()
for supplier in suppliers:
    if isinstance(supplier, str):
        safe_supplier = supplier.replace('/', '_')
        supplier_df = df[df['Vendor Name'] == supplier].copy()
        wb = load_workbook(blank_order_book_path)
        ws = wb["Data Dump"]
        data = supplier_df.columns.tolist() + supplier_df.values.tolist()
        for row_idx, row in enumerate(data, 1):
            for col_idx, value in enumerate(row, 1):
                ws.cell(row=row_idx, column=col_idx, value=value)
                wb.save(f"{safe_supplier}.xlsx")
print("All files saved to Downloads Folder")

问题:

我现在的做法处理起来非常慢,特别是对于较大的数据集。我怀疑我的代码可能有些地方不够高效,但我不太确定具体是哪里。

背景:

我在用Python编程,使用了一些库,比如tkinterpandasosopenpyxlshutilxlsxwriter来进行文件操作和数据处理。我是在Windows环境下运行这段代码。

期望:

我希望这段代码能够高效地根据“供应商名称”来拆分Excel文件,并把每个部分保存到“Downloads/VendorSplittingApp”文件夹里。

1 个回答

0

看起来你只是想找出哪些地方比较耗费资源。我看到的两个最耗费资源的地方是(1)嵌套的列/行循环和(2)在最内层循环中写文件。

除非在每次最内层循环中写数据文件是绝对必要的(看起来你是按行写的?)……不如把写文件的操作移到和前面每行循环同一层级。

另外一个完全不同的选择是,你可以在运行Python代码之前,先用PowerQuery准备或整理你的数据。虽然我不知道你的数据是什么样的,但这可能值得考虑。

接下来,如果有可能把最内层循环拆开,那可能会有所帮助。看起来这个问题是你事先就知道列数的。除非列数非常多,把最内层循环拆成单独的代码行可能会有帮助。如果列数少但行数很多,效果可能会更明显。

虽然你代码中的其他操作看起来也可能比较耗费资源,但在列/行循环中的操作可能是最值得优先考虑的。

最后……作为一种完全不同的方法,你可以把数据转换成CSV格式,然后解析纯文本,而不是Excel对象。这显然意味着需要完全重写代码,但这也是一个选择。

撰写回答