如何用Python堆叠合并多个Excel工作簿的指定Tablet工作表
原代码问题排查
原代码漏数据、删行失效有4个明确原因:
- 路径拼接错误:
os.listdir(path)仅返回文件名,未拼接目标文件夹完整路径,若脚本运行的工作目录和Excel存放目录不一致,pd.read_excel(file)会直接报文件不存在错误,跳过对应文件。 - 无异常/存在性校验:直接指定
sheet_name='Tablet'读取,遇到无该工作表的文件时会直接抛出ValueError终止整个循环,后续所有文件都不会被处理,是漏数据的核心原因。 - 方法兼容性问题:pandas 1.4.0及以上版本已经弃用
DataFrame.append()方法,高版本环境下运行会直接抛错。 - 删行逻辑位置错误:把drop语句作用在合并后的总表上,自然只会删除总表最开头的7行,不可能对每个单独读入的工作表生效。
修正后代码
import os import pandas as pd # 替换为你的Excel文件存放目录 path = r"path_location" df_list = [] total_excel = 0 valid_count = 0 skip_list = [] for file in os.listdir(path): # 过滤xlsx文件,同时跳过Excel打开时生成的~$开头临时文件 if file.endswith('.xlsx') and not file.startswith('~$'): total_excel += 1 file_full_path = os.path.join(path, file) try: # 先读取文件结构,校验是否存在Tablet工作表 xls_reader = pd.ExcelFile(file_full_path) if 'Tablet' not in xls_reader.sheet_names: skip_list.append(f"{file}:无Tablet工作表") continue # 读取时直接跳过开头7行冗余数据,无需读完再删除 temp_df = pd.read_excel(xls_reader, sheet_name='Tablet', skiprows=7) # 可选:新增来源文件列,方便后续核对数据归属 temp_df['source_file'] = file df_list.append(temp_df) valid_count += 1 except Exception as e: skip_list.append(f"{file}:读取失败,错误信息{str(e)}") # 一次性合并所有有效数据 final_df = pd.concat(df_list, ignore_index=True) # 导出csv,指定编码避免中文乱码,不导出行号 final_df.to_csv('Tablet_total.csv', index=False, encoding='utf-8-sig') # 打印处理日志,方便核对结果 print(f"共扫描到{total_excel}个有效Excel文件") print(f"成功合并{valid_count}个文件的Tablet工作表数据") print(f"未处理文件清单:{skip_list}")
关键改动说明
- 路径处理:用
os.path.join()拼接文件完整路径,同时自动过滤临时文件,避免工作目录不匹配导致的文件找不到问题。 - 容错处理:读取前先校验工作表是否存在,遇到损坏文件、缺工作表的情况仅记录文件名,不会中断整个循环,跑完会输出未处理清单方便核对。
- 冗余行处理:读取阶段直接通过
skiprows=7参数跳过开头7行,从根源避免删行错位问题,比读完再drop效率更高。 - 合并逻辑优化:用列表暂存每个工作表的DataFrame,最后通过
pd.concat()一次性合并,兼容所有pandas版本,处理速度比循环append高30%以上,适合批量文件场景。 - 导出优化:导出时指定
utf-8-sig编码避免中文乱码,关闭行号导出减少冗余字段。
内容的提问来源于stack exchange,提问作者andibraj
相关产品推荐
相关产品推荐

