Python合并Excel文件并写入文件名至列报错:无对象可拼接求助
问题:合并指定目录Excel文件并插入文件名失败,报错"No objects to concatenate"
我正在用Python合并指定目录下的Excel文件,同时把文件名插入到Excel列中,但功能无法正常运行,运行后报错:
raise ValueError("No objects to concatenate")
ValueError: No objects to concatenate
我的实现代码如下:
import os import pandas as pd import numpy as np dir_path = 'D:/Test Merge' files = [a for a in os.listdir(dir_path) if a.endswith('.xlsx')] sheetname = 'CAPEX (2)' dfs = [] for file in files: file_path = os.path.join(dir_path,file) try: df = pd.read_excel(file_path,sheet_name=sheetname) df['filename'] = os.path.basename() dfs.append(df) except Exception as a: print("Not Found") merged_df = pd.concat(dfs) merged_df.to_excel(os.path.join('D:/Test Merge','merge_data.xlsx'), index=False)
问题分析与修复
报错的核心原因是dfs列表为空,没有任何DataFrame可以合并,导致pd.concat()抛出异常。具体问题出在这几个地方:
os.path.basename()参数缺失
这个方法必须传入文件路径参数才能返回文件名,你的代码里没传值,会直接触发异常,导致每次循环都进入except块,dfs始终没有添加任何数据。异常捕获信息太模糊
只打印"Not Found"无法定位具体错误(比如是sheet不存在,还是文件读取失败,还是其他问题),不利于排查。可选优化:兼容更多Excel格式
只筛选.xlsx会漏掉.xlsm等其他Excel格式文件,如果需要可以调整后缀判断。
修正后的代码
import os import pandas as pd dir_path = 'D:/Test Merge' # 兼容xlsx和xlsm格式,可根据需要调整 files = [f for f in os.listdir(dir_path) if f.endswith(('.xlsx', '.xlsm'))] sheetname = 'CAPEX (2)' dfs = [] for file in files: file_path = os.path.join(dir_path, file) try: df = pd.read_excel(file_path, sheet_name=sheetname) # 直接用循环变量file获取文件名,简单高效 df['filename'] = file dfs.append(df) print(f"成功读取文件: {file}") except Exception as e: # 打印具体错误信息,方便快速排查问题 print(f"处理文件 {file} 时出错: {str(e)}") if dfs: merged_df = pd.concat(dfs) output_path = os.path.join(dir_path, 'merge_data.xlsx') merged_df.to_excel(output_path, index=False) print(f"合并完成,结果已保存至: {output_path}") else: print("没有成功读取任何文件,无法执行合并操作")
关键修改说明
- 修复文件名获取问题:直接使用循环变量
file就能得到文件名,不需要调用os.path.basename()(如果需要带路径的文件名,也可以用os.path.basename(file_path))。 - 增强异常排查能力:打印出错的文件名和具体错误内容,快速定位问题(比如某个文件的sheet名不对、文件损坏等)。
- 添加空列表判断:避免
pd.concat()在dfs为空时抛出异常,提前给出明确提示。 - 兼容更多Excel格式:如果有
.xlsm格式的文件也能被读取,可根据实际需求调整后缀规则。
内容的提问来源于stack exchange,提问作者Eki Triyatno
相关产品推荐
相关产品推荐

