2016-04-15 63 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()的数据,所以我希望没有突然的行为,但谢谢你的回应。 –