使用numpy loadtxt与for循环读取多CSV文件失败问题排查
问题原因
你的循环只执行一次就终止,是因为return data, i写在了for循环的内部。return语句会直接结束函数执行,所以第一次循环读取完data1.csv后,函数就返回结果退出了,根本不会进入后续的循环迭代。
解决方案
要读取所有CSV文件的数据,需要先把每个文件的数据收集起来统一返回,或者用生成器逐个输出结果。
方案1:收集所有数据到列表后返回
修改代码,把每次读取的数据存入列表,循环结束后返回整个列表:
import numpy as np def show_datasets(filenames): data_list = [] for i, filename in enumerate(filenames): data = np.loadtxt(filename, delimiter=',', dtype=float) data_list.append((data, i)) return data_list # 调用并打印每个结果 results = show_datasets(['data1.csv', 'data2.csv', 'data3.csv']) for res in results: print(res)
运行后会输出你期望的三个文件的结果。
方案2:使用生成器逐个返回数据
如果文件很大,不想一次性加载所有数据到内存,可以用生成器(yield)逐个返回:
import numpy as np def show_datasets(filenames): for i, filename in enumerate(filenames): data = np.loadtxt(filename, delimiter=',', dtype=float) yield data, i # 遍历生成器获取结果 for res in show_datasets(['data1.csv', 'data2.csv', 'data3.csv']): print(res)
这种方式每次只加载一个文件的数据,处理完再加载下一个,更节省内存。
补充说明
- 使用
enumerate(filenames)可以直接同时获取索引i和文件名filename,比手动用range(len(filenames))更简洁直观。 - 原代码里的
data=[]定义后被覆盖成了单个numpy数组,没有起到收集数据的作用,修正后改用data_list来存储每个文件的(data, i)元组。
内容的提问来源于stack exchange,提问作者wannabe-engineer
相关产品推荐
相关产品推荐

