大家好,我是何三,80后老猿,独立开发者。
继续我们的“5分钟Python自动化”系列。上次我们学会了《5分钟学会用Python从网站抓取数据》,解放了双手。今天,我们来解决另一个办公中的高频痛点——批量处理Excel文件。
有这样的场景:你是行政、财务或销售,每周/每月都要从不同同事或系统那里收到一堆格式相同的Excel报表:销售一部.xlsx
、销售二部.xlsx
... 你的任务是把这几十个文件打开,把里面的数据一个个复制粘贴到一个总表里进行汇总分析。
传统做法:一个个打开文件,眼睛盯着屏幕找数据,手不停地Ctrl+C
、Ctrl+V
,耗时半小时起步,头晕眼花,还容易漏掉行或列。
Python做法:1个脚本,执行3秒钟,一键合并所有文件!从此准时下班不是梦。
今天,我就带你用5分钟,掌握这个让无数办公族羡慕的“黑科技”!
环境准备:这次多一步,一劳永逸
在开始之前,你需要:
- 安装Python(这个已经有了)
- 安装一个关键库:打开你的命令行(CMD或终端),输入下面这行命令,然后按回车:
bash pip install pandas openpyxl
pandas
:Python里处理表格数据的“瑞士军刀”,强大到没朋友。openpyxl
:让pandas能读写新版Excel文件(.xlsx)的“引擎”。
- 一个文本编辑器
- 一个装满待合并Excel文件的文件夹
就多了一步安装库,但换来的能力是颠覆性的!
核心代码:10行搞定报表合并
让我们直接上“魔法”,感受一下用代码操控数据的快感:
import pandas as pd # 导入数据分析工具箱
import os # 导入文件操作工具箱
# 设置存放所有Excel文件的文件夹路径
folder_path = "./销售报表"
# 创建一个空的列表,用来装每个文件的数据
all_data = []
# 遍历文件夹中的每一个文件
for file in os.listdir(folder_path):
# 只处理Excel文件
if file.endswith('.xlsx') or file.endswith('.xls'):
# 构建完整的文件路径
file_path = os.path.join(folder_path, file)
# 读取Excel文件,将其变为pandas的DataFrame(一种表格数据结构)
df = pd.read_excel(file_path)
# 把这个表格数据添加到总列表中
all_data.append(df)
# 将列表中的所有表格数据垂直堆叠合并成一个大的总表
final_df = pd.concat(all_data, ignore_index=True)
# 将合并后的总表保存到一个新的Excel文件中
final_df.to_excel("合并后的总报表.xlsx", index=False)
print("所有Excel文件合并完成!快去查看‘合并后的总报表.xlsx’吧!")
逐行详解:理解数据合并的奥秘
第1-2行:导入超级工具箱
import pandas as pd
import os
pandas
是我们的主力,给它起个昵称pd
,后面用起来更方便。
第3-5行:锁定目标与准备“容器”
folder_path = "./销售报表"
all_data = []
- 指定你的Excel文件堆放在哪个文件夹。
all_data = []
准备一个空的“魔法篮子”,用来装每个Excel文件里的数据。
第6-13行:循环读取,见一个“吃”一个
for file in os.listdir(folder_path):
if file.endswith('.xlsx') or file.endswith('.xls'):
file_path = os.path.join(folder_path, file)
df = pd.read_excel(file_path)
all_data.append(df)
这是脚本的核心逻辑:
for file in ...
:让电脑自动浏览销售报表
文件夹里的每一个文件。if file.endswith(...)
:做一个判断,只对以.xlsx
或.xls
结尾的Excel文件下手。file_path = ...
:拼凑出文件的完整地址,告诉电脑文件在哪。df = pd.read_excel(file_path)
:最关键的魔法!pd.read_excel()
函数能直接读取整个Excel文件的内容,并将其转换成一个叫DataFrame
的智能表格对象,我们把它赋值给变量df
。all_data.append(df)
:把这个智能表格df
放进我们准备好的“魔法篮子”all_data
里。
第14-17行:合并数据并输出成果
final_df = pd.concat(all_data, ignore_index=True)
final_df.to_excel("合并后的总报表.xlsx", index=False)
pd.concat(all_data, ...)
:第二个关键魔法!concat
函数能把“篮子”里所有的智能表格(df
)垂直地堆叠、拼接在一起,形成一个巨大的总表final_df
。ignore_index=True
是为了让合并后的总表行号从0开始重新整齐排列。
to_excel(...)
:将最终合并好的大总表final_df
,写入到一个全新的Excel文件里。index=False
表示不将DataFrame的行索引保存到Excel中,让表格更整洁。
实战演示:告别复制粘贴
- 准备阶段:创建一个名为
销售报表
的文件夹,里面放几个测试的Excel文件(确保它们的表头/列结构是一样的)。 - 保存脚本:将上面的代码保存为
merge_excel.py
,放在与销售报表
文件夹同级的目录。 - 运行脚本:打开命令行,输入:
python merge_excel.py
- 查看结果:脚本运行完毕后,当前目录下会生成一个全新的
合并后的总报表.xlsx
文件,打开它,所有分公司的数据都已经整整齐齐地合并在一起了!
运行前:
销售报表/
├── 销售一部.xlsx
├── 销售二部.xlsx
├── 销售三部.xlsx
└── ...
运行后:
(当前目录)/
├── merge_excel.py
├── 销售报表/ (里面的文件原封不动)
└── 合并后的总报表.xlsx <-- 新生成的终极总表!
举一反三:定制你的数据处理流水线
这个脚本的潜力远不止简单合并,稍微修改,它就能变成你的专属数据助理:
案例1:合并时只读取特定Sheet
如果你的Excel文件有多个工作表,只想合并名为"月度数据"
的Sheet:
# 在 pd.read_excel() 里加上 sheet_name 参数
df = pd.read_excel(file_path, sheet_name='月度数据')
案例2:合并时只保留需要的列
假设你只关心"销售人员"
、"销售额"
、"日期"
这三列:
# 读取时指定列
df = pd.read_excel(file_path, usecols=['销售人员', '销售额', '日期'])
案例3:给每个分部的数据打上标签
合并后想知道某条数据来自哪个分部?
for file in os.listdir(folder_path):
if file.endswith('.xlsx'):
file_path = os.path.join(folder_path, file)
df = pd.read_excel(file_path)
# 新增一列‘分部名称’,值为文件名(去掉扩展名)
df['分部名称'] = os.path.splitext(file)[0]
all_data.append(df)
案例4:处理CSV文件
如果你的数据是.csv
格式,只需改动一行:
# 将判断和读取Excel的代码换成CSV的:
if file.endswith('.csv'):
df = pd.read_csv(file_path) # 使用 read_csv 函数
注意事项与进阶技巧
确保表头一致
合并的前提是各个Excel文件的列名(表头)是一致的,否则数据会对不上。在运行前最好先抽查确认一下。
更健壮的增强版脚本
添加错误处理,让脚本更稳定、更友好:
import pandas as pd
import os
folder_path = "./销售报表"
all_data = []
for file in os.listdir(folder_path):
if file.endswith(('.xlsx', '.xls')): # 支持多种Excel格式
file_path = os.path.join(folder_path, file)
try:
# 尝试读取文件
df = pd.read_excel(file_path)
# 可选:在这里进行数据清洗,比如去除空行
# df = df.dropna()
all_data.append(df)
print(f"成功读取并缓存: {file}")
except Exception as e:
# 如果某个文件读取失败,打印错误并继续处理下一个,而不是整个脚本崩溃
print(f"!!! 读取文件 {file} 时出错: {e} !!!")
if all_data: # 检查列表是否为空
final_df = pd.concat(all_data, ignore_index=True)
final_df.to_excel("合并后的总报表.xlsx", index=False)
print(f"合并完成!共处理 {len(all_data)} 个文件,总数据行数:{len(final_df)}")
else:
print("未找到任何可处理的Excel文件,请检查文件夹路径和文件格式。")
结语:你的数据分析师之路,从此开始
恭喜!在又一个5分钟内,你解锁了一项更高级的自动化技能:
✅ 用pandas
库轻松读取Excel数据
✅ 使用循环自动处理多个数据文件
✅ 用concat
函数实现数据表的智能合并
✅ 具备了编写健壮脚本的错误处理意识
今天你学会的不仅仅是合并Excel,而是打开了一扇名为“数据处理自动化”的大门。
想象一下,接下来你可以: - 批量对每个Excel文件进行数据清洗和计算。 - 自动从总表中生成可视化图表和报告。 - 定时运行这个脚本,实现日报、周报的自动汇总。
工具的意义在于将人从重复劳动中解放出来,去从事更有创造性的工作。
现在,就去找一个你工作中需要合并Excel的场景,用这个脚本去试一试!在评论区分享你用这5分钟节省了多少小时的生命吧!