Python实现多Excel文件多工作表多列数据提取的代码优化求助
代码优化建议
原代码存在的问题
- 路径拼接循环无实际作用:你写了循环拼接
local_path但没有保存或使用这个完整路径,后续读取文件依赖os.chdir切换目录,这种方式不够健壮(比如后续代码改变目录会出问题)。 - 函数内语法错误:
return df_dict缩进错误,不在函数代码块内,会导致运行报错;另外print(df_dict[element].keys)中keys是字典的方法,需要加括号keys(),且这个print放在循环外只会打印最后一个文件的工作表名称。 - 未过滤非Excel文件:
os.listdir会返回目标文件夹下所有文件/文件夹,包括非Excel格式的文件,直接读取会抛出错误。 - 冗余变量:
main_dict定义后未使用,属于无效代码。
优化后的代码方案
下面是修复问题并优化后的代码,同时针对「所有文件工作表结构一致」的特点,增加了按工作表名合并所有对应数据的选项(根据你的需求选择):
import os import pandas as pd folder = r'specified_path' # 过滤出文件夹下的Excel文件(支持.xlsx/.xls/.xlsm格式) excel_files = [f for f in os.listdir(folder) if f.lower().endswith(('.xlsx', '.xls', '.xlsm'))] def load_excel_data(folder_path, files): # 存储每个文件的所有工作表数据 file_sheets_dict = {} # 存储按工作表名合并后的所有数据(可选,适合结构一致的场景) merged_sheets = {} for file_name in files: file_path = os.path.join(folder_path, file_name) # 读取文件所有工作表,返回{工作表名: DataFrame}的字典 sheet_data = pd.read_excel(file_path, sheet_name=None) file_sheets_dict[file_name] = sheet_data # 合并同名工作表的数据(如果需要) for sheet_name, df in sheet_data.items(): # 添加来源文件列,方便后续溯源 df['source_file'] = file_name if sheet_name not in merged_sheets: merged_sheets[sheet_name] = [] merged_sheets[sheet_name].append(df) # 将合并后的列表转为单个DataFrame for sheet_name in merged_sheets: merged_sheets[sheet_name] = pd.concat(merged_sheets[sheet_name], ignore_index=True) # 可以根据需求返回其中一个或两个字典 return file_sheets_dict, merged_sheets # 调用函数 all_file_data, merged_data = load_excel_data(folder, excel_files) # 示例:打印第一个文件的所有工作表名 if all_file_data: first_file = next(iter(all_file_data.keys())) print(f"文件 {first_file} 的工作表:{list(all_file_data[first_file].keys())}") # 示例:打印合并后的第一个工作表的前5行 if merged_data: first_sheet = next(iter(merged_data.keys())) print(f"\n合并后的工作表 {first_sheet} 预览:") print(merged_data[first_sheet].head())
额外优化点说明
- 使用完整路径读取文件:不再依赖
os.chdir,避免目录切换带来的潜在问题。 - 过滤Excel文件:通过后缀名筛选有效文件,避免读取非Excel文件报错。
- 增加数据溯源:合并时添加
source_file列,方便后续知道每条数据来自哪个文件。 - 灵活的数据结构:同时保留「按文件存储工作表」和「按工作表合并所有数据」两种结构,满足不同处理需求。
内容的提问来源于stack exchange,提问作者Harsh780
相关产品推荐
相关产品推荐

