案例1:Python 数据处理——批量处理Excel文件
案例1:Python 数据处理——批量处理Excel文件
需求描述
有一个文件夹“学生数据”,里面包含多个Excel文件(后缀为.xlsx),每个文件包含“姓名、年龄、班级、成绩”4列数据,要求用Python批量读取所有Excel文件,筛选出成绩≥80分的学生,合并成一个新的Excel文件,保存到“学生数据”文件夹,命名为“优秀学生.xlsx”,使用pandas库,代码附带注释,处理文件不存在、列名错误、数据类型异常的情况。
Claude 输入
“用Python写一个批量处理Excel文件的脚本,需求如下:
- 读取文件夹‘学生数据’内所有.xlsx格式的Excel文件;
- 筛选出每个文件中成绩≥80分的学生;
- 将所有筛选后的学生数据合并成一个新的Excel文件;
- 新文件保存到‘学生数据’文件夹,命名为‘优秀学生.xlsx’;
- 使用pandas库,代码附带详细注释,确保能直接运行;
- 处理异常情况:文件夹不存在、Excel文件中无‘成绩’列、成绩数据不是数字。”
生成代码(参考)
import pandas as pd
import os
## 定义文件夹路径(确保文件夹存在,若不存在可创建)
folder_path = "学生数据"
if not os.path.exists(folder_path):
os.makedirs(folder_path)
print(f"文件夹‘{folder_path}’不存在,已自动创建")
## 用于存储所有筛选后的优秀学生数据
excellent_students = []
## 遍历文件夹内所有.xlsx文件
for filename in os.listdir(folder_path):
# 只处理.xlsx格式的文件
if filename.endswith(".xlsx"):
# 拼接文件完整路径
file_path = os.path.join(folder_path, filename)
try:
# 读取Excel文件(默认读取第一个工作表)
df = pd.read_excel(file_path)
# 检查“成绩”列是否存在
if "成绩" not in df.columns:
print(f"警告:文件{filename}中无‘成绩’列,跳过该文件")
continue
# 处理成绩数据类型异常,将非数字类型的成绩设为NaN(后续筛选会排除)
df["成绩"] = pd.to_numeric(df["成绩"], errors="coerce")
# 筛选成绩≥80分的学生(排除NaN值)
filtered_df = df[df["成绩"] >= 80].dropna(subset=["成绩"])
# 将筛选后的数据添加到列表中
excellent_students.append(filtered_df)
print(f"已处理文件:{filename},筛选出优秀学生{len(filtered_df)}人")
except Exception as e:
# 捕获其他异常(如文件损坏、无法读取)
print(f"处理文件{filename}时出现错误:{str(e)},跳过该文件")
## 合并所有筛选后的学生数据
if excellent_students:
merged_df = pd.concat(excellent_students, ignore_index=True)
# 保存合并后的数据到新Excel文件
output_path = os.path.join(folder_path, "优秀学生.xlsx")
merged_df.to_excel(output_path, index=False)
print(f"处理完成!优秀学生数据已保存到:{output_path}")
else:
print("未找到符合条件的Excel文件,或没有成绩≥80分的学生。")
效果测试与调整
- 在本地创建“学生数据”文件夹,放入几个包含学生数据的Excel文件(可故意设置1个无“成绩”列的文件、1个成绩为非数字的文件,测试异常处理功能);
- 复制生成的代码,粘贴到Python编辑器,运行代码;
- 若运行报错“ModuleNotFoundError: No module named 'pandas'”,则在终端输入“pip install pandas openpyxl”(openpyxl用于读取.xlsx文件),安装依赖库,重新运行;
- 若Excel文件中“成绩”列名不同(如“分数”),则回到Claude Code 输入区,补充“Excel文件中成绩列名为‘分数’,请修改代码”,重新生成代码即可;
- 若需要添加“按班级排序”功能,可补充需求“合并后的数据按班级升序排序,班级相同则按成绩降序排序”,重新生成代码。