2017-08-30 63 views
2

我试图从许多HDF5文件中提取值并将其存储在列表中。如何在Python列表理解中关闭文件?

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

这个列表解析包含从HDF5文件filenum0.h5 'key' 的阵列中的网格点(10,10)的值 - filenum99.h5

它的工作原理,但它停止与周围的错误50元:
IOError: unable to open file (File accessibilty: Unable to open file)
即使我知道文件的存在,如果我还没有开设了许多其他文件可以打开。我想我得到的错误是因为打开了太多的文件。

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

+0

你不能,你最好用传统的循环。 – jonrsharpe

+0

看到这篇文章https://stackoverflow.com/a/45929510/4531270 – pylang

回答

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

你可以做当然,通过不硬编码“关键”参数,get_data函数更通用。

+0

实际上这不应该做的,可变的操作不应该在理解中执行。也许你忘了在函数中返回结果? – Netwave

+0

'h5py.File()'不支持上下文管理器接口吗? – AChampion

+0

它的确,是的...抱歉,没有返回结果,我的坏! –

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

但我会强烈建议不要这样的事情,和喜欢,而不是一个辅助功能或一些其他方法。

+1

是的,建议不要为副作用构建对象。但这足够酷。 pylang链接的答案也是一个很好的领导:https://stackoverflow.com/a/45929510/4531270 –