Python批量处理Excel与CSV文件的高效实践

发布时间:2026/9/15 6:35:53
Python批量处理Excel与CSV文件的高效实践 1. 为什么需要批量处理表格文件每天上班第一件事我都要打开十几个Excel文件提取数据。复制粘贴到手软不说还经常漏掉几个文件。直到有天加班到凌晨三点我决定用Python解放双手。现在处理100个文件只需要喝杯咖啡的时间准确率还100%。批量处理Excel和CSV的场景实在太常见了财务人员每月要合并几十个部门的报销单电商运营需要统计多个平台的销售数据科研工作者要处理实验仪器导出的成百上千个CSV人事部门要汇总各分公司的人员信息手动操作不仅效率低下还容易出错。上周我隔壁工位的同事就因复制错行数据导致月度报告全部返工。而用Python脚本处理这些问题都不复存在。2. 工具选型与环境准备2.1 必备工具全家桶经过多年实战我固定使用这套黄金组合Python 3.8版本太旧会缺少新特性pandas数据处理核心库安装命令pip install pandasopenpyxl处理xlsx格式pip install openpyxlxlrd兼容老xls格式pip install xlrd注意xlrd 2.0不再支持xls文件如需读取旧版Excel必须安装1.2.0版本pip install xlrd1.2.02.2 开发环境配置推荐使用VS Code Jupyter插件组合新建data_process.ipynb文件首个单元格导入必备库import pandas as pd from pathlib import Path import glob实测这种交互式环境最适合数据处理调试比纯脚本方便太多。上周帮财务部培训时他们用PyCharm经常卡在调试环节换成VS Code后学习曲线直线下降。3. 文件批量读取技巧3.1 自动发现目标文件我总结出三种高效定位文件的方法方法一glob通配符excel_files glob.glob(./data/*.xlsx) # 获取所有xlsx csv_files glob.glob(./reports/**/*.csv, recursiveTrue) # 递归搜索方法二Path对象遍历folder Path(monthly_reports) all_files [f for f in folder.iterdir() if f.suffix in [.csv, .xlsx]]方法三OS模块扫描import os files [f for f in os.listdir() if f.endswith((.csv,.xls))]避坑指南遇到中文路径报错时改用pathlib模块的Path()对象处理路径完美兼容各种操作系统。3.2 多文件读取方案对比根据数据量大小选择不同策略场景方案代码示例内存占用小文件(10MB)直接全量读取pd.read_excel(file)高中等文件(10-100MB)分块读取pd.read_csv(chunksize5000)中大文件(100MB)按需读取列pd.read_excel(usecols[A,C])低上周处理市场部的200MB用户数据时用chunksize参数成功避免了内存溢出比他们之前用的Excel宏稳定多了。4. 核心数据处理实战4.1 数据清洗标准化流程这是我打磨三年的清洗模板def clean_data(df): # 处理空值 df df.dropna(subset[关键列]) df.fillna({数值列:0, 文本列:未知}, inplaceTrue) # 统一格式 df[日期列] pd.to_datetime(df[日期列], errorscoerce) df[金额列] df[金额列].str.replace(,,).astype(float) # 去重处理 return df.drop_duplicates(subset[ID列])常见坑点日期格式混乱时加errorscoerce将无效日期转为NaT金额字段含千分符必须先去除符号再转数值去重前务必确认业务逻辑有些重复数据是合理的4.2 多文件合并技巧纵向合并同结构combined pd.concat([pd.read_csv(f) for f in csv_files], ignore_indexTrue)横向合并键值关联result df1.merge(df2, on员工ID, howleft)复杂合并案例 上周帮HR做的考勤合并脚本base_df pd.read_excel(基础信息.xlsx) attendance_dfs [pd.read_excel(f) for f in glob.glob(考勤/*.xlsx)] final_df base_df for df in attendance_dfs: final_df final_df.merge(df, on[工号,日期], howouter)5. 输出结果优化方案5.1 智能输出配置这段代码根据数据量自动选择最佳输出方式def smart_export(df, filename): if len(df) 1000000: # 大数据分片存储 with pd.ExcelWriter(filename, engineopenpyxl) as writer: for i, chunk in enumerate(np.array_split(df, 10)): chunk.to_excel(writer, sheet_namefPart_{i}, indexFalse) else: # 常规存储 df.to_excel(filename, indexFalse)5.2 格式美化技巧让Excel自动适配列宽def adjust_column_width(writer, sheet_name, df): worksheet writer.sheets[sheet_name] for idx, col in enumerate(df.columns): max_len max(( df[col].astype(str).str.len().max(), len(str(col)) )) 2 worksheet.column_dimensions[chr(65idx)].width max_len6. 实战案例销售报表自动化最近给某连锁店做的解决方案# 1. 收集各门店数据 store_files glob.glob(2023/*/sales.xlsx) all_data [] for file in store_files: df pd.read_excel(file) df[门店] file.split(/)[1] # 提取门店名 all_data.append(df) # 2. 数据清洗 combined pd.concat(all_data) combined (combined .pipe(clean_data) .query(金额 0) .assign(月份lambda x: x[日期].dt.month) ) # 3. 生成报表 with pd.ExcelWriter(年度汇总.xlsx) as writer: # 各月销售趋势 (combined.groupby(月份)[金额].sum() .to_excel(writer, sheet_name月度汇总)) # 门店排名 (combined.groupby(门店)[金额].agg([sum,count]) .sort_values(sum, ascendingFalse) .to_excel(writer, sheet_name门店排名)) # 商品分析 (combined.groupby(商品ID)[金额].sum() .nlargest(20) .to_excel(writer, sheet_name热销商品))这个脚本每月为客户节省40人工小时关键是再也不会有漏统计的门店了。7. 性能优化方案7.1 加速读取的秘诀对于纯数值CSV用dtype指定类型提速30%dtypes {ID:int32, price:float32} pd.read_csv(data.csv, dtypedtypes)读取时过滤无用行pd.read_excel(bigfile.xlsx, skiprowsrange(1,1000))7.2 内存优化技巧处理5GB销售数据时的解决方案chunk_list [] for chunk in pd.read_csv(huge.csv, chunksize100000): chunk chunk.query(region East) chunk_list.append(chunk) final_df pd.concat(chunk_list)8. 异常处理与日志记录健壮的脚本必须包含错误处理import logging logging.basicConfig(filenameprocess.log, levellogging.INFO) def safe_read(file): try: if file.suffix .csv: return pd.read_csv(file, encodinggbk) else: return pd.read_excel(file) except Exception as e: logging.error(f处理{file.name}失败: {str(e)}) return None这个月处理2000文件时有3个文件编码异常全靠日志定位问题。