如何解决Pandas循环中重复生成Excel文件的问题
问题解决:仅在指定文件夹生成单个Excel文件
核心问题原因
当前代码生成两份文件,是因为先在当前目录用pd.ExcelWriter生成了初始文件,之后加载该文件修改样式后,又保存到test_files文件夹。要实现仅在目标文件夹生成单个文件,只需让所有文件操作都直接指向test_files路径即可。
修改步骤
- 确保目标文件夹存在:先检查
test_files文件夹是否存在,不存在则创建,避免保存时报错。 - 统一文件路径:所有涉及文件读写的操作,都使用
test_files下的完整路径,不再单独生成当前目录的中间文件。 - 调整文件加载与保存路径:修改
pd.ExcelWriter、load_workbook和wb1.save的路径参数,全程指向目标文件夹。
修改后的完整代码
import numpy as np import pandas as pd from numpy.random import default_rng from openpyxl import load_workbook from openpyxl.styles import copy_styles from openpyxl.worksheet.table import Table, TableStyleInfo from openpyxl.utils import get_column_letter import os # 确保test_files文件夹存在,不存在则创建 os.makedirs('test_files', exist_ok=True) # 生成示例DataFrame rng = default_rng(100) cdf = pd.DataFrame({"Id":[1,2,3,4,5], "customer": rng.choice(list('ACD'),size=(5)), "region": rng.choice(list('PQRS'),size=(5)), "dumeel": rng.choice(list('QWER'),size=(5)), "dumma": rng.choice((1234),size=(5)), "target": rng.choice([0,1],size=(5)) }) # 假设col_list是你需要保留的列,这里补充示例(如果实际代码已有可忽略) col_list = ["Id", "customer", "region", "dumeel", "dumma", "target"] i = 0 for k, v in cdf.groupby(['customer']): # 注意原代码中是Customer,这里和DataFrame的列名统一为customer print(k.split('@')[0]) LM = k.split('@')[0] i = i+1 unique_cust_names = '_'.join(v['customer'].astype(str).unique()) unique_ids = '_'.join(v['Id'].astype(str).unique()) unique_location = '_'.join(v['dumeel'].astype(str).unique()) filename = '_'.join([unique_ids, unique_cust_names, unique_location, LM]) print(filename) # 构造目标文件夹下的完整文件路径 file_path = f"test_files/{filename}.xlsx" # 直接将初始文件写入test_files文件夹 with pd.ExcelWriter(file_path, engine='xlsxwriter') as writer: v.to_excel(writer, columns=col_list, index=False) # 加载test_files中的文件进行样式修改 wb = load_workbook(filename='format_sheet.xlsx') sheet_from = wb.worksheets[0] wb1 = load_workbook(filename=file_path) sheet_to = wb1.worksheets[0] copy_styles(sheet_from, sheet_to) # 添加表格样式 tab = Table(displayName="Table1", ref=f"A1:{get_column_letter(wb1.worksheets[0].max_column)}{wb1.worksheets[0].max_row}") style = TableStyleInfo(name="TableStyleMedium2", showFirstColumn=False, showLastColumn=False, showRowStripes=True, showColumnStripes=False) tab.tableStyleInfo = style wb1.worksheets[0].add_table(tab) # 直接保存到目标路径(已在file_path中指定) wb1.save(file_path) wb1.close() print("Total number of customers to be emailed is ", i)
额外说明
- 代码中补充了
os.makedirs确保文件夹存在,避免因文件夹未创建导致的保存失败。 - 修正了原代码中
groupby(['Customer'])与DataFrame列名customer的大小写不一致问题(如果你的实际列名是大写Customer,可改回)。 - 所有文件操作都使用
file_path变量,确保全程在test_files文件夹内完成,不会在当前目录生成冗余文件。
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

