You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:45:58