Python遍历多工作簿多工作表插入新列遇ValueError求助
解决遍历多Excel工作簿/工作表插入列时的ValueError问题
错误详情
运行代码时在工作表循环环节触发错误:
ValueError: Invalid file path or buffer object type: <class 'collections.OrderedDict'>
原代码
for i, file in enumerate(file_list): print(i, file) wb = pd.ExcelFile(file) print(wb.sheet_names) sheets = pd.read_excel(workbook, None) for sheet in wb.sheet: file1 = pd.read_excel(file_list[i], sheet) file1.insert(loc=2, column ='group_number', value = (file1.groupby(['p_key']).ngroup() + 1000) + group_number) file1.insert(loc=3, column ='batch_number', value = file1['group_number'].apply(lambda x: round_down(x, 1000))) file1.insert(loc=8, column = "primary_owner_2", value = file1["primary_owner"]) wb.save("batched_"+ file_list[i][6:]) # file1.to_excel(writer, sheet_name = sheet, index = False) group_number = group_number + len(file1.groupby(by = "p_key")) print(group_number)
问题分析与修正
核心错误点
- 变量名错误:
wb.sheet是不存在的属性,正确的工作表名称列表是wb.sheet_names - 未定义变量与逻辑错位:
pd.read_excel(workbook, None)中的workbook未定义,且该行代码脱离外层文件循环,逻辑完全错误 - 保存方式错误:
pd.ExcelFile对象没有save方法,需要用pd.ExcelWriter来写入修改后的内容 - 缩进错误:外层循环的
print(wb.sheet_names)等代码缩进错误,导致wb只指向最后一个文件,循环逻辑混乱
修正后的代码
import pandas as pd # 实现round_down函数(原代码未定义,需补充) def round_down(x, base=1000): return base * (x // base) group_number = 0 # 初始化group_number,可根据实际需求调整初始值 for i, file in enumerate(file_list): print(i, file) # 一次性读取当前工作簿的所有工作表 all_sheets = pd.read_excel(file, sheet_name=None) # 定义输出文件名 output_file = "batched_" + file[6:] # 使用ExcelWriter写入修改后的内容 with pd.ExcelWriter(output_file) as writer: for sheet_name, df in all_sheets.items(): # 插入目标列 df.insert(loc=2, column='group_number', value=(df.groupby(['p_key']).ngroup() + 1000) + group_number) df.insert(loc=3, column='batch_number', value=df['group_number'].apply(lambda x: round_down(x, 1000))) df.insert(loc=8, column="primary_owner_2", value=df["primary_owner"]) # 将修改后的工作表写入新文件 df.to_excel(writer, sheet_name=sheet_name, index=False) # 更新group_number group_number += len(df.groupby(by="p_key")) print(f"处理完成:{output_file}") print(f"最终group_number值:{group_number}")
关键修改说明
- 用
pd.read_excel(file, sheet_name=None)一次性读取工作簿所有工作表,返回的字典包含所有工作表名和对应DataFrame - 使用
pd.ExcelWriter配合上下文管理器(with),安全写入修改后的所有工作表,避免文件占用问题 - 修正循环逻辑,确保每个文件的所有工作表都被处理,且
group_number正确累加 - 移除原代码中无用的
pd.ExcelFile和未定义的workbook相关代码
内容的提问来源于stack exchange,提问作者user19754170
相关产品推荐
相关产品推荐

