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

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)

问题分析与修正

核心错误点

  1. 变量名错误:wb.sheet是不存在的属性,正确的工作表名称列表是wb.sheet_names
  2. 未定义变量与逻辑错位:pd.read_excel(workbook, None)中的workbook未定义,且该行代码脱离外层文件循环,逻辑完全错误
  3. 保存方式错误:pd.ExcelFile对象没有save方法,需要用pd.ExcelWriter来写入修改后的内容
  4. 缩进错误:外层循环的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:40:23