2017-08-30 7 views
2

私は多くのHDF5ファイルから値を抜き出してリストに格納しようとしています。 filenum99.h5 -どのようにあなたは、Pythonのリストの理解の中でファイルを閉じますか?

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

このリスト内包表記は、HDF5ファイルfilenum0.h5から 'キー' 配列で格子点(10、10)の値が含まれています。

それは誤りで50番目の要素の周りに停止していることを除いて、作品:私は、ファイルが存在し、私は他の多くのファイルを開いていない場合は、それを開くことができます知っているにもかかわらず
IOError: unable to open file (File accessibilty: Unable to open file)
。あまりにも多くのファイルが開かれているので、私はエラーが発生すると思います。

このリスト内のファイルを閉じる方法はありますか? または、私が望むリストを構築するためのより効果的な方法はありますか?

+0

あなたは、伝統的なループを使う方がよいでしょう。 – jonrsharpe

+0

この投稿を参照してくださいhttps://stackoverflow.com/a/45929510/4531270 – pylang

答えて

4

あなたがやっているようにすることで、ファイルが閉じられたときを制御することができません。

これを制御できますが、1ライナーでは制御できません。あなたは、データを返す補助方法を必要とし、

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

はあなたが作ることができる(h5pyファイルは、私はちょうどチェックすることをサポートするようコンテキストマネージャは、さらに良いです使用して)ファイルをクローズget_dataは、もちろん、「鍵」の引数を1&のハードコーディングしないことでより一般的です。

+0

これは実際には行われてはならない、変更可能な操作は理解の中で実行すべきではありません。たぶん、関数の結果を返すのを忘れたのでしょうか? – Netwave

+0

'h5py.File()'はコンテキストマネージャインタフェースをサポートしていませんか? – AChampion

+0

それは、はい...申し訳ありませんが、結果を返していない、私の悪い! –

2

引数のために、あなたこのような1つの恐ろしいリストの内包ですべてを行うことができます:

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 –

関連する問題