文件夹多文件按组求列均值写入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
相关产品推荐
相关产品推荐

