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

文件夹多文件按组求列均值写入Excel的Python代码报错求助

问题:Python文件分组求均值写入Excel时的生成器错误

需求说明

编写Python函数实现以下功能:

  • 从指定文件夹路径读取文件,每个文件存储2×N的数组(N为任意长度)
  • 将文件按每n个为一组分组
  • 对每组内所有文件的第二行按列求均值
  • 将每组的均值结果写入Excel文件,循环处理完所有文件

示例

当传入路径和n=2时,文件夹中的文件对应数组:

[1,2;3,4] [1,2;5,6]
[1,2;7,8] [1,2;9,10]
[1,2;3,4] [1,2;9,10]

输出到Excel的结果应为:

4 5
8 9
6 7

当前代码

def fileavg(path,n):
    import numpy as np
    import xlsxwriter
    from glob import glob

    workbook = xlsxwriter.Workbook('Test.xlsx')
    worksheet = workbook.add_worksheet()
    row=0
    
    glob.iglob(path) #when inputting path name begin with r' and end with a '
    for i in range(0,len(1),n):
        f=yield 1[i:i +n]
        A=np.mean(f(1),axis=1)
        for col, data in enumerate(A):
            worksheet.write_column(row, col, data)
        row +=1

遇到的问题

运行函数时出现Generator Object Error,作为Python新手,希望了解该错误含义及代码中的具体问题。


问题分析与修复

1. 生成器错误的原因

你代码中使用了yield关键字,这会让fileavg变成生成器函数,而非普通函数。生成器函数调用后不会直接执行代码,只会返回一个生成器对象,直接调用就会触发这类错误——这就是你遇到的Generator Object Error的根源。你的需求完全不需要生成器,直接删除yield即可。

2. 代码中的其他问题

  • 文件路径处理无效:glob.iglob(path)仅创建迭代器,但未保存或遍历获取文件路径;且path需要指定文件格式(如r"*.txt"),否则无法匹配目标文件。
  • len(1)逻辑错误:1是整数,调用len(1)会直接报错,需先获取所有文件的列表,再用列表长度控制循环。
  • 缺失文件读取逻辑:代码完全没有读取文件内容的步骤,直接对f调用f(1)是错误的,f应为文件路径列表,需逐个读取文件内的数组。
  • 均值计算方向错误:需求是按列求均值,axis=1是按行计算,应改为axis=0。
  • Excel写入逻辑错误:write_column用于写入整列,但此处需将每行均值写入对应单元格,应使用write(row, col, data)。

修复后的代码

import numpy as np
import xlsxwriter
from glob import glob

def fileavg(path, n):
    # 获取文件夹下所有目标文件(示例为txt格式,可根据实际修改)
    file_paths = glob(path)
    if not file_paths:
        print("未找到任何文件")
        return
    
    workbook = xlsxwriter.Workbook('Test.xlsx')
    worksheet = workbook.add_worksheet()
    row = 0

    # 按每n个文件分组循环
    for i in range(0, len(file_paths), n):
        group_files = file_paths[i:i+n]
        group_second_rows = []
        
        # 读取每组中每个文件的第二行
        for file in group_files:
            # 读取文件,分隔符根据实际文件格式调整
            arr = np.loadtxt(file, delimiter=';')
            # 提取第二行(数组索引从0开始)
            second_row = arr[1]
            group_second_rows.append(second_row)
        
        # 按列求均值
        mean_row = np.mean(group_second_rows, axis=0)
        
        # 将均值写入Excel当前行
        for col, val in enumerate(mean_row):
            worksheet.write(row, col, val)
        row += 1
    
    # 必须关闭工作簿才能保存内容
    workbook.close()

# 调用示例:读取当前文件夹下所有txt文件,每2个一组
# fileavg(r"./*.txt", 2)

关键说明

  • 确保path参数是正确的文件匹配模式,比如r"./*.txt"表示当前文件夹下所有txt文件
  • 文件读取部分的delimiter需根据实际文件格式调整(比如你的示例用;分隔行,内部用逗号分隔数值,可按需修改读取逻辑)
  • 必须调用workbook.close(),否则Excel文件内容无法正常保存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:31:21