2016-04-15 5 views
2

ここでは非常に奇妙な問題があります。私は、h5pyを使って作成したHDF5ファイルを読み込む関数と、前の関数から返された内容を連結する新しいHDF5ファイルを作成する関数の2つの関数を持っています。返されたh5pyオブジェクトインスタンスにアクセスできない

def read_file(filename): 
    with h5py.File(filename+".hdf5",'r') as hf: 

     group1 = hf.get('group1') 
     group1 = hf.get('group2')    
     dataset1 = hf.get('dataset1') 
     dataset2 = hf.get('dataset2') 
     print group1.attrs['w'] # Works here 

     return dataset1, dataset2, group1, group1 

、今の問題は、データセットと作成し、WD1、WD2、WG1とWG2に代表される新しいファイルのプロパティは、私がアクセスすることができているファイル機能

def create_chunk(start_index, end_index): 

    for i in range(start_index, end_index): 
     if i == start_index: 
      mergedhf = h5py.File("output.hdf5",'w') 
      mergedhf.create_dataset("dataset1",dtype='float64') 
      mergedhf.create_dataset("dataset2",dtype='float64') 

      g1 = mergedhf.create_group('group1') 
      g2 = mergedhf.create_group('group2') 

    rd1,rd2,rg1,rg2 = read_file(filename) 

    print rg1.attrs['w'] #gives me <Closed HDF5 group> message 

    g1.attrs['w'] = "content" 
    g1.attrs['x'] = "content" 
    g2.attrs['y'] = "content" 
    g2.attrs['z'] = "content" 
    print g1.attrs['w'] # Works Here 
return mergedhf.get('dataset1'), mergedhf.get('dataset2'), g1, g2 

def calling_function(): 
    wd1, wd2, wg1, wg2 = create_chunk(start_index, end_index) 
    print wg1.attrs['w'] #Works here as well 

を作成し、私は属性データにアクセスすることができますが、私はそれを読み込んで値を返すことはできません。

呼び出し元関数への参照を返したときに、誰でもデータセットとグループの値を取得する手助けがありますか?

答えて

2

問題は、read_fileこのラインである:

with h5py.File(filename+".hdf5",'r') as hf: 

これは即ちときread_file戻り、withブロックの終わりにhfを閉じます。これが起こると、データセットとグループも閉じられ、アクセスできなくなります。

これを修正するには少なくとも2つの方法があります。

hf = h5py.File(filename+".hdf5", 'r') 

をし、それを閉じる前に、限り、あなたはそれを必要と周りhfへの参照を保持:あなたがcreate_chunkで行うようにまず、あなたはファイルを開くことができ

hf.close() 

他の方法はにありますread_fileでのデータセットからデータをコピーして、それらを返す:あなたはグループでこれを行うことはできません

dataset1 = hf.get('dataset1')[:] 
dataset2 = hf.get('dataset2')[:] 

注意を。あなたはグループで何かをする必要がある限り、ファイルを開く必要があります。

+0

ありがとう、Pythonには比較的新しいので、「やっている」ことが何をしているのか分かりませんでした。私はすでにデータセットのコンテンツをコピーして取得していましたが、グループはすべての問題を作成していました。 もう1つの質問ですが、hf.close()を使ってファイル参照を閉じないと、次にファイルを読み込んだときに自動的に上書きされるか閉じられますか? –

+0

私は理解していません。 'hf.close()'が呼び出されるまで、データは実際には書き込まれません。 – Yossarian

+0

強制的にデータを書き込むにはhf.flush()を使用していますので、突然の動作は望んでいませんが、応答に感謝します。 –

関連する問題