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

How do you close a file within a python list comprehension?

我正在尝试从许多 HDF5 文件中提取值并存储在列表中。

import h5py
h = [h5py.File('filenum_%s.h5' % (n),'r')['key'][10][10] for n in range(100)]

此列表理解包含来自 HDF5 文件 filenum0.h5-filenum99.h5.

的 'key' 数组中网格点 (10, 10) 处的值

有效,除了它在第 50 个元素附近停止并出现错误:
IOError: unable to open file (File accessibilty: Unable to open file)
即使我知道该文件存在并且如果我没有打开许多其他文件也可以打开它。我想我收到错误是因为打开了太多文件。

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

按照您现在的做法,您无法控制文件何时关闭。

你可以控制它,但不能用单线。你需要一个辅助方法,它 returns 数据,并关闭文件(使用上下文管理器更好,因为 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 和 'key' 参数进行硬编码来使 get_data 函数更通用。

为了论证,你可以在一个糟糕的列表理解中做所有事情,就像这样:

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

但我强烈建议不要使用类似的方法,而更喜欢使用辅助函数或其他方法。