批量对比目录中XLSX文件同名工作表数据的问题排查与优化
问题排查与代码优化
原代码问题分析
1. df1_keys_list长度异常
原代码中df1_keys_list是全局变量,每次循环都会将当前文件的所有工作表名追加到列表中,导致列表不断累积变长(比如每个文件16个表,循环多次后长度自然远超5)。
2. 修改文件后对比结果仍显示correct
由于df1_keys_list持续累积,后续循环中df1_days = df1_keys_list[0:5]取的是最早几个文件的表名,而非当前文件的表名,导致对比的不是修改后的目标工作表。此外,原代码重复读取Excel文件,不仅效率低,还可能引发读取逻辑错误。
其他潜在问题
os.listdir返回的文件名不保证按日期排序,可能导致相邻文件不是时间上连续的。- 循环范围
range(len(filenames))会在最后一次迭代时访问filenames[i+1],引发索引越界错误。 - 重复读取Excel文件,浪费IO资源。
优化后的代码
import pandas as pd import os from datetime import date path_root = r'C:\Users\Files' filenames = [file for file in os.listdir(path_root) if file.endswith('.xlsx')] # 按文件名中的日期排序(适配格式:prealign_debug_MMDD.xlsx) def get_date_from_filename(filename): month = int(filename[-9:-7]) day = int(filename[-7:-5]) # 若文件名包含年份,需在此处补充年份解析逻辑 return date(year=2024, month=month, day=day) filenames.sort(key=get_date_from_filename) # 遍历所有连续文件对 for i in range(len(filenames) - 1): current_file = filenames[i] next_file = filenames[i+1] current_path = os.path.join(path_root, current_file) next_path = os.path.join(path_root, next_file) # 一次性加载所有工作表到字典(避免重复读取) current_sheets = pd.read_excel(current_path, sheet_name=None) next_sheets = pd.read_excel(next_path, sheet_name=None) # 找出两个文件的公共工作表(即重复日期的工作表) common_sheets = set(current_sheets.keys()) & set(next_sheets.keys()) if not common_sheets: print(f"{current_file} 与 {next_file} 无重复日期工作表") continue # 逐个对比公共工作表 for sheet_name in common_sheets: df_current = current_sheets[sheet_name] df_next = next_sheets[sheet_name] if df_current.equals(df_next): print(f"{current_file} 与 {next_file} 的工作表 '{sheet_name}':数据一致") else: print(f"{current_file} 与 {next_file} 的工作表 '{sheet_name}':数据不一致")
关键优化点说明
- 文件名排序:通过解析文件名中的日期信息,确保文件按时间顺序排列,保证相邻文件是连续的日期文件。
- 避免全局列表累积:直接从每次加载的工作表字典中获取表名,不再使用全局列表存储,解决表名长度异常问题。
- 单次文件读取:使用
sheet_name=None一次性加载所有工作表到字典,避免重复读取文件,提升效率。 - 自动识别重复工作表:通过集合交集自动找出两个文件的公共工作表(即重复日期的表),无需手动指定位置,适配不同文件的重复规则。
- 修复循环越界:循环范围改为
range(len(filenames)-1),只处理到倒数第二个文件,避免访问不存在的filenames[i+1]。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

