Python 批量合并多个 CSV 并去重导出 Excel,复制即用 Python 批量合并多个 CSV 并去重导出 Excel复制即用场景说明上周帮学妹处理期末作业她手上有 12 个班级的 CSV 成绩表每个文件几百行需要合并成一个总表还要去掉重复的学生记录。她之前用 Excel 手动复制粘贴搞了半小时还漏了数据差点崩溃。这种场景太常见了销售数据、实验记录、调研问卷……当 CSV 文件超过 3 个手动操作就是折磨。今天给你一个 50 行的 Python 脚本复制粘贴、改个路径就能跑自动合并、去重、导出 Excel。完整脚本import pandas as pd import os from pathlib import Path def merge_csv_deduplicate(input_folder, output_file, encodingutf-8, dedup_columnsNone, keepfirst): 合并文件夹内所有 CSV 文件去重后导出 Excel 参数: input_folder: CSV文件所在文件夹路径 output_file: 输出Excel文件路径含.xlsx后缀 encoding: CSV文件编码默认utf-8可改为gbk/gb2312 dedup_columns: 去重依据的列名列表None表示所有列 keep: 去重保留方式first保留第一条last保留最后一条 # 确保输入文件夹存在 if not os.path.exists(input_folder): raise FileNotFoundError(f文件夹不存在: {input_folder}) # 获取所有CSV文件 csv_files list(Path(input_folder).glob(*.csv)) if not csv_files: raise ValueError(f文件夹 {input_folder} 中没有找到CSV文件) print(f找到 {len(csv_files)} 个CSV文件) # 存储所有数据的列表 all_data [] # 逐个读取CSV文件 for i, csv_file in enumerate(csv_files): try: df pd.read_csv(csv_file, encodingencoding) if df.empty: print(f警告: {csv_file.name} 为空文件已跳过) continue # 添加来源标记可选 df[来源文件] csv_file.name all_data.append(df) print(f[{i1}/{len(csv_files)}] 已读取: {csv_file.name} ({len(df)}行)) except UnicodeDecodeError: # 编码错误时尝试其他编码 try: df pd.read_csv(csv_file, encodinggbk) df[来源文件] csv_file.name all_data.append(df) print(f[{i1}/{len(csv_files)}] 已读取(GBK): {csv_file.name} ({len(df)}行)) except Exception as e: print(f错误: 无法读取 {csv_file.name}: {e}) except Exception as e: print(f错误: 读取 {csv_file.name} 失败: {e}) if not all_data: raise ValueError(没有成功读取任何CSV文件) # 合并所有DataFrame merged_df pd.concat(all_data, ignore_indexTrue) print(f\n合并后总行数: {len(merged_df)}) # 去重 before_dedup len(merged_df) if dedup_columns: # 按指定列去重 merged_df merged_df.drop_duplicates(subsetdedup_columns, keepkeep) else: # 所有列完全一致才去重 merged_df merged_df.drop_duplicates(keepkeep) after_dedup len(merged_df) print(f去重后行数: {after_dedup} (去除了 {before_dedup - after_dedup} 行重复)) # 导出为Excel try: merged_df.to_excel(output_file, indexFalse, engineopenpyxl) print(f\n✓ 成功导出到: {output_file}) except Exception as e: print(f错误: 导出Excel失败: {e}) # 备用方案导出为CSV csv_output output_file.replace(.xlsx, .csv) merged_df.to_csv(csv_output, indexFalse, encodingutf-8-sig) print(f已导出为CSV备用: {csv_output}) return merged_df # 使用示例 if __name__ __main__: # 修改这里的路径即可运行 INPUT_FOLDER ./csv_files # 存放CSV的文件夹 OUTPUT_FILE ./merged_result.xlsx # 输出Excel路径 # 按学生ID和姓名去重适用于成绩表 dedup_cols [学号, 姓名] # 根据你的CSV列名修改 # 执行合并去重 result merge_csv_deduplicate( input_folderINPUT_FOLDER, output_fileOUTPUT_FILE, encodingutf-8, # 如果中文乱码改成 gbk dedup_columnsdedup_cols, keepfirst # 保留第一条重复记录 )使用步骤1. 安装依赖pip install pandas openpyxl2. 准备文件- 把所有 CSV 文件放到同一个文件夹比如./csv_files- 确保 CSV 文件有相同的列名大小写要一致3. 修改脚本在脚本最下面的if __name__ __main__:部分- 把INPUT_FOLDER改成你的 CSV 文件夹路径- 把OUTPUT_FILE改成你想保存的 Excel 文件名- 把dedup_cols改成你用来判断重复的列名比如[学号]或[姓名, 手机号]4. 运行python merge_csv.py常见坑坑1中文乱码- 症状读取 CSV 时报UnicodeDecodeError或中文显示为乱码- 解决把encodingutf-8改成encodinggbk或encodinggb2312- 脚本已经加了自动尝试 GBK 编码的逻辑但还是建议手动指定正确编码坑2列名不一致- 症状合并后数据错位比如成绩列变成了姓名列- 解决确保所有 CSV 文件的列名完全一致包括空格和大小写- 可以用 Excel 打开每个 CSV 检查第一行坑3空行干扰- 症状去重后还有空行或全是 NaN 的行- 解决在脚本的if df.empty判断后加一行df df.dropna(howall) # 删除全空的行坑4Excel 导出失败- 症状ModuleNotFoundError: No module named openpyxl- 解决pip install openpyxl- 如果还不行脚本会自动导出为 CSV 文件坑5去重逻辑不对- 症状明明有重复记录却没去掉- 解决检查dedup_columns参数确保填对了列名- 比如按学生 ID 去重就写[学号]按学号姓名去重就写[学号, 姓名]可改参数| 参数 | 说明 | 默认值 | 推荐修改场景 ||------|------|--------|-------------||input_folder| CSV文件夹路径 | 必填 | 改成你的文件夹 ||output_file| 输出Excel路径 | 必填 | 改成你想要的路径 ||encoding| CSV编码 | utf-8 | 中文乱码时改gbk ||dedup_columns| 去重依据列 | None(全列) | 按学号/ID去重时填写 ||keep| 保留方式 | first | 想保留最新记录改last |进阶用法- 想按多列去重dedup_columns[学号, 课程ID]- 想保留最后一条重复keeplast- 想处理多个文件夹循环调用这个函数如果你有更多自动化需求比如每周自动合并报表、批量处理实验数据可以关注我后续分享。评论区有问必答遇到报错把截图发上来帮你排查。