Python Can';t访问返回了h5py对象实例

Python Can';t访问返回了h5py对象实例,python,python-2.7,hdf5,h5py,Python,Python 2.7,Hdf5,H5py,我有一个很奇怪的问题。我有两个函数:一个读取使用h5py创建的HDF5文件,另一个创建一个新的HDF5文件,该文件连接前一个函数返回的内容 def read_file(filename): with h5py.File(filename+".hdf5",'r') as hf: group1 = hf.get('group1') group1 = hf.get('group2') dataset1 = hf.get(

我有一个很奇怪的问题。我有两个函数:一个读取使用h5py创建的HDF5文件,另一个创建一个新的HDF5文件,该文件连接前一个函数返回的内容

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
以及创建文件功能

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
def创建块(开始索引、结束索引):
对于范围内的i(开始索引,结束索引):
如果i==开始索引:
mergedhf=h5py.File(“output.hdf5”,“w”)
mergedhf.create_数据集(“dataset1”,dtype='float64')
mergedhf.create_数据集(“dataset2”,dtype='float64')
g1=mergedhf.create_组('group1'))
g2=mergedhf.create_组('group2'))
rd1、rd2、rg1、rg2=读取文件(文件名)
打印rg1.attrs['w']#给我消息
g1.attrs['w']=“内容”
g1.attrs['x']=“内容”
g2.attrs['y']=“内容”
g2.attrs['z']=“内容”
打印g1.attrs['w']#在这里工作
返回mergedhf.get('dataset1')、mergedhf.get('dataset2')、g1、g2
def调用_函数():
wd1,wd2,wg1,wg2=创建块(开始索引,结束索引)
打印wg1.attrs['w']#在这里也适用
现在的问题是,我可以访问由wd1、wd2、wg1和wg2创建和表示的新文件中的数据集和属性,并且我可以访问属性数据,但我无法执行相同的操作,因为我已经读取并返回了属性数据的值


当我返回对调用函数的引用时,有人能帮我获取数据集和组的值吗?

问题出在
读取文件中,这一行:

with h5py.File(filename+".hdf5",'r') as hf:
这将在带有
块的
末尾关闭
hf
,即当
读取文件
返回时。发生这种情况时,数据集和组也会关闭,您无法再访问它们

有(至少)两种方法可以解决这个问题。首先,您可以像在
create\u chunk
中一样打开文件:

hf = h5py.File(filename+".hdf5", 'r')
并在关闭之前,根据需要随时保留对
hf
的引用:

hf.close()
另一种方法是从
read_file
中的数据集中复制数据,然后返回这些数据:

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

请注意,您不能对组执行此操作。只要您需要对组执行操作,该文件就需要打开。

非常感谢,因为python比较新,所以不知道“with”在做什么。我已经通过复制数据集内容来获取数据集内容,但是这些组制造了所有的麻烦。还有一个问题,如果我不使用hf.close()关闭文件引用,它会在我下次读取文件时自动被覆盖或关闭吗?我的理解是,它尚未确定。例如,在调用
hf.close()
之前,数据实际上可能不会被写入。要强制写入数据,我使用的是hf.flush(),因此我希望不会出现突然行为,但感谢您的响应。