遍历多工作表多Excel文件生成单DataFrame及代码修复求助
问题分析与修复代码
原函数仅保留最后一个文件数据的核心问题如下:
df_list在每个文件循环内初始化,每次处理新文件都会清空之前的累积数据return df放在了工作表循环内部,导致处理完第一个工作表就直接返回,后续文件和工作表完全没执行- 函数参数与内部变量不匹配(比如参数是
start_row,代码里却用row_min) - 非Excel文件会触发后续代码,导致
ws未定义报错 - 文件路径用硬编码斜杠拼接,跨平台兼容性差
修改后的完整代码:
import os import pandas as pd from openpyxl import load_workbook def excel_to_df(folder, start_row, end_row, start_col, end_col): # 将df_list移到最外层,用于累积所有文件的数据 df_list = [] # 遍历文件夹内所有文件 for file in os.listdir(folder): # 用os.path.join安全拼接文件路径,适配不同操作系统 exact_file_path = os.path.join(folder, file) print(exact_file_path) # 仅处理xlsx文件,且所有逻辑包裹在if块内,避免非xlsx文件触发报错 if file.endswith('xlsx'): try: wb = load_workbook(exact_file_path) ws_list = wb.worksheets # 遍历当前文件的所有工作表 for worksheet in ws_list: name = worksheet.title cell_values = [] # 修正变量名,与函数传入的参数对应 for row in worksheet.iter_rows(min_row=start_row, max_row=end_row, min_col=start_col, max_col=end_col): cell_values.append([cell.value for cell in row]) # 生成当前工作表的DataFrame,空数据则跳过 if cell_values: df = pd.DataFrame(cell_values, columns=range(start_col, end_col+1), index=[name]*len(cell_values)) df_list.append(df) except Exception as e: print(f"处理文件 {file} 时出错: {str(e)}") # 所有文件处理完成后,再合并所有DataFrame并导出 if df_list: final_df = pd.concat(df_list) final_df.to_csv('整合结果.csv', index=True) return final_df else: print("未找到有效Excel文件或无可用数据") return pd.DataFrame()
关键修改点说明
- 把
df_list初始化移至文件循环外,确保所有文件的工作表数据都能被累积 - 将
return、pd.concat、to_csv移到所有循环结束后,保证所有数据都被处理 - 修正参数与内部变量的名称不匹配问题
- 用
os.path.join替代硬编码路径拼接,提升跨平台兼容性 - 加入
try-except捕获文件加载错误,增强代码鲁棒性 - 添加空数据判断,避免合并空列表导致的报错
内容的提问来源于stack exchange,提问作者VRN NRV
相关产品推荐
相关产品推荐

