2017-08-30 62 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 –