如何使用Python堆叠多个Excel文件数据并保证合并顺序正确
解决pandas批量合并Excel时堆叠顺序与文件夹内文件排序不一致问题
问题根因
glob.glob() 方法返回的文件路径列表不保证固定排序,遍历顺序完全由操作系统的文件系统底层逻辑决定,因此会出现堆叠顺序和你在文件夹中看到的排序不一致的情况。
解决方案
对glob.glob()返回的文件路径列表先按照你的需求排序,再遍历读取合并即可。
修改后可直接运行的代码
import pandas as pd import glob import os # 读取所有目标Excel文件路径 file_paths = glob.glob("/Users/xxxx/xxxx/xxxx/Data/*.xlsx") # 基础排序:按文件名字母/数字升序排列,适配文件名带日期(如20240101.xlsx)的场景 sorted_file_paths = sorted(file_paths) # 如果你需要按文件修改时间排序,替换上方排序逻辑为以下代码即可 # sorted_file_paths = sorted(file_paths, key=lambda x: os.path.getmtime(x)) # 遍历读取文件并合并 df_list = [] for f in sorted_file_paths: df = pd.read_excel(f, sheet_name='data') # 可选操作:新增来源文件名列,方便后续排查顺序问题 # df['source_file'] = os.path.basename(f) df_list.append(df) # 合并时加ignore_index重置行索引,避免多个子表索引重复 all_data = pd.concat(df_list, ignore_index=True) # 保存结果 with pd.ExcelWriter('output.xlsx') as writer: # 加index=False不输出默认行索引,减少冗余字段 all_data.to_excel(writer, sheet_name='sheet1', index=False)
自定义排序适配方案
如果你的文件名规则特殊,基础排序不符合需求,可以自定义排序key,比如文件名格式为「门店A_2024-01-01_业绩表.xlsx」,可以提取其中的日期字段排序:
def extract_sort_key(file_path): file_name = os.path.basename(file_path) # 提取文件名中的日期字符串 date_str = file_name.split("_")[1] # 转成时间格式作为排序依据 return pd.to_datetime(date_str) sorted_file_paths = sorted(file_paths, key=extract_sort_key)
内容的提问来源于stack exchange,提问作者user12447159
相关产品推荐
相关产品推荐

