我试图从多个HDF5文件中提取值并存储在列表中。
import h5py
h = [h5py.File('filenum_%s.h5' % (n),'r')['key'][10][10] for n in range(100)]
此列表推导包含'键中的网格点(10,10)处的值。来自HDF5文件的数组filenum0.h5
- filenum99.h5
。
它起作用,除了它在第50个元素周围停止并带有错误:
IOError: unable to open file (File accessibilty: Unable to open file)
即使我知道该文件存在,如果我还没有打开许多其他文件,它可以打开。我想我得到了错误,因为打开了太多文件。
有没有办法关闭此列表理解中的文件? 或者,是否有更有效的方法来构建我想要的列表?
答案 0 :(得分:4)
通过像您一样,您无法控制文件何时关闭。
您可以控制它,但不能使用单行。你需要一个返回数据的辅助方法,并关闭文件(使用上下文管理器更好,因为h5py
文件支持,我刚检查过)
def get_data(n):
with h5py.File('filenum_%s.h5' % (n),'r') as f:
return f['key'][10][10]
然后
h = [get_data(n) for n in range(100)]
您可以通过不对10&硬编码进行硬编码来使get_data
功能更通用。 '键'当然是争论。
答案 1 :(得分:2)
为了争论,你可以在一个可怕的列表理解中做所有事情:
import h5py
h = [(f['key'][10][10], f.close())[0]
for f in (h5py.File('filenum_%s.h5' % (n),'r') for n in range(100))]
但我强烈建议不要这样做,而宁愿选择辅助功能或其他方法。