2016-04-15 25 views
2

我在這裏有一個非常奇怪的問題。我有兩個函數:一個讀取使用h5py創建的HDF5文件,另一個創建連接前一個函數返回的內容的新HDF5文件。無法訪問返回的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: 

這在with塊的結尾關閉hf,即當read_file回報。發生這種情況時,數據集和組也會關閉,您不能再訪問它們。

有(至少)兩種方法來解決這個問題。首先,就像你在create_chunk你可以打開文件:

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

,並保持參考hf只要身邊,你需要它,在關閉前:

hf.close() 

的另一種方式是複製從數據集的數據read_file並返回那些代替:

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

請注意,你不能用組做到這一點。只要您需要對羣組執行操作,該文件就需要打開。

+0

非常感謝,相對較新的Python,所以不知道什麼「與」在做什麼。我已經通過複製來獲取數據集內容,但這些組正在創建所有問題。 還有一個問題,如果我不使用hf.close()關閉文件引用,它會在下次讀取文件時自動覆蓋或關閉嗎? –

+0

我的理解是它不確定。例如,在調用'hf.close()'之前,數據可能實際上不會被寫入。 – Yossarian

+0

要強制寫入我使用hf.flush()的數據,所以我希望沒有突然的行爲,但謝謝你的迴應。 –