如何在python列表理解中关闭文件?

时间:2017-08-30 19:28:34

标签: python list h5py

我试图从多个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)
即使我知道该文件存在,如果我还没有打开许多其他文件,它可以打开。我想我得到了错误,因为打开了太多文件。

有没有办法关闭此列表理解中的文件? 或者,是否有更有效的方法来构建我想要的列表?

2 个答案:

答案 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))]

但我强烈建议不要这样做,而宁愿选择辅助功能或其他方法。