乐于分享
好东西不私藏

第2期:45个Excel按文件名分组合并,40行Python代码搞定

第2期:45个Excel按文件名分组合并,40行Python代码搞定

这学期我带了5个班、3门课,每门课有平时、期中、期末三张成绩表——共45个文件。

学期末归档时,学校要求将每个班每门课的三个成绩表合并成一个文档。手动合并?45个文件,打开、复制、粘贴,不仅慢,更怕错行漏列。

于是我把所有文件复制到 D:\PythonTest,写了个Python程序,一键搞定。

下面分享整个过程,看看是不是也能解决你的问题。


第一步:明确需求

我们需要完成的任务:

  1. 将45个文件按“课程+班级”分组(例如“大数据分析-计科1班”为一组)
  2. 每组包含3个文件:平时、期中、期末
  3. 将三个文件按“学号”合并成一张总评成绩表 三个文件的结构如下(仅成绩列不同):

通过学号关联,将每个同学的三个成绩合并到一行,生成总评表。


第二步:安装必要的工具

💡 提示:这一步只需做一次。操作前确认电脑可以联网。

打开cmd(Win+R,输入cmd,回车),输入以下命令,按回车:

pip install pandas openpyxl

💡提示: 看到“Successfully installed” = 安装成功!如果最后出现了“A new release of pip is available”提示不用理会,不影响使用。

第三步:准备好要合并的文件

D:盘新建文件夹:PythonTest,将我们需要合并的文件复制到这里。

💡 提示:创建好的完整路径是D:\PythonTest如果在前几期的操作中已经创建了该目录,继续使用就好。如果该文件夹下已有其他文件,请将文件暂时移动到别的地方保存。

第四步:代码实现

第1步D:盘新建文件夹:python,该文件夹作为我们存放python脚本文件的地方。

💡 提示:如果在前几期的操作中已经创建了这个目录,继续使用就好。

第2步在 D:\python 文件夹里新建merge_excel.py文件。

💡 提示:新建文本文件,将后缀名改为.py即可。

第3步记事本或其他文本编辑器打开后输入或复制如下代码:

💡 代码设计思路

  • 首先从D:\PythonTest目录中获取所有Excel文件
  • 将所有文件按分类名(课程+班级)分组
  • 按分好的组合并文件
  • 将合并好的文件输出到D:\PythonTestOut目录下
  • 提示用户看到”所有分组处理完成!”后,按回车退出程序。
import pandas as pdimport os# 指定合并文件的路径folder = r"D:\PythonTest"# 指定输出文件的路径folder_out = r"D:\PythonTestOut"# 检查输入文件夹是否存在if not os.path.exists(folder):print(f"❌ 文件夹不存在:{folder}")    input("按回车退出")exit()# 创建输出文件夹(如果不存在)if not os.path.exists(folder_out):    os.makedirs(folder_out)print(f"✅ 已创建输出文件夹:{folder_out}")def extract_group_key(filename):"""从文件名提取分组标识(课程+班级)"""    parts = filename.split("-")if len(parts) >= 4:return"-".join(parts[:-1])return Nonedef extract_score_type(filename):"""从文件名提取成绩类型"""    parts = filename.split("-")if len(parts) >= 1:return parts[-1].replace(".xlsx""")return None# 1、从D:\PythonTest中获取所有Excel文件all_files = [f for f in os.listdir(folder) if f.endswith('.xlsx') and "总成绩" not in f]if not all_files:print("❌ 文件夹中没有Excel文件")    input("按回车退出")exit()# 2.将所有文件按分类名(课程+班级)分组groups = {}for file in all_files:    group_key = extract_group_key(file)    score_type = extract_score_type(file)if group_key and score_type:        groups.setdefault(group_key, {})[score_type] = fileelse:print(f"⚠️ 文件名格式不符:{file}")# 3.按分好的组合并文件for group_key, files_dict in groups.items():print(f"\n正在处理【{group_key}】...")    required = {"平时""期中""期末"}if not required.issubset(files_dict.keys()):print(f"  ❌ 缺少文件,跳过")continue    df_dict = {}for score_type, file in files_dict.items():        try:            df = pd.read_excel(os.path.join(folder, file))            score_col = df.columns[-1]            df = df[["学号""姓名", score_col]].copy()            df.rename(columns={score_col: score_type}, inplace=True)            df_dict[score_type] = dfprint(f"  ✓ 已读取:{file},共{len(df)}人")        except Exception as e:print(f"  ✗ 读取失败:{file},错误:{e}")if len(df_dict) != 3:continue    result = df_dict["平时"].merge(df_dict["期中"], on=["学号""姓名"], how="outer")    result = result.merge(df_dict["期末"], on=["学号""姓名"], how="outer")    result.fillna(0, inplace=True)    result.insert(0, "序号", range(1, len(result) + 1))    output_path = os.path.join(folder_out, f"{group_key}-合并表.xlsx")    result.to_excel(output_path, index=False)print(f"  ✅ 完成!共{len(result)}人")# 4.看到"所有分组处理完成!"后,按回车退出程序。print("\n🎉 所有分组处理完成!")input("按回车退出")

💡 提示:代码输入完成后,记得 保存哦。

第4步在cmd窗口中输入以下命令,按回车:

python D:\python\merge_excel.py

💡提示: 看到输出“🎉 所有分组处理完成!” = 搞定!  按回车退出程序即可

第5步D:盘找到文件夹D:\PythonTestOut查看合并后生成的文件。

💡提示: 此处看到的便是我们从45个文件中合并出来的15个汇总文件。

第6步 打开文件,检查结果

💡提示: 这就是我们合并后的文件效果。

至此,按文件名分组合并文件完成!


⚠️ 本文追求最小闭环极简风格

只保留核心步骤,不堆砌冗余。代码仅供学习参考,若遇问题可留言。

📌 相关推荐