You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量对比目录中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}':数据不一致")

关键优化点说明

  1. 文件名排序:通过解析文件名中的日期信息,确保文件按时间顺序排列,保证相邻文件是连续的日期文件。
  2. 避免全局列表累积:直接从每次加载的工作表字典中获取表名,不再使用全局列表存储,解决表名长度异常问题。
  3. 单次文件读取:使用sheet_name=None一次性加载所有工作表到字典,避免重复读取文件,提升效率。
  4. 自动识别重复工作表:通过集合交集自动找出两个文件的公共工作表(即重复日期的表),无需手动指定位置,适配不同文件的重复规则。
  5. 修复循环越界:循环范围改为range(len(filenames)-1),只处理到倒数第二个文件,避免访问不存在的filenames[i+1]。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:55:03