h5py:如何在 HDF5 组和数据集上使用 keys() 循环

h5py: how to use keys() loop over HDF5 Groups and Datasets

print(list(file.keys()))

当我 运行 此代码时,我得到:

T00000000,T00000001,T00000002,T00000003, ... ,T00000474

现在,我分析了 T00000000,但我想用 for 循环扫描它们。我做不到,因为这是一个字符串。有什么办法吗?

是的,您可以使用 split() 方法。

如果字符串是“T00000000,T00000001,T00000002,T00000003, ...,T00000474”,您可以使用 split 在列表中打开它,如下所示:

string = "T00000000,T00000001,T00000002,T00000003, ... ,T00000474"
values = string.split(",")

因此,列表值变为 ["T00000000", "T00000001","T00000003", ... ,"T000000474"]

然后你可以在for循环中使用它。

如果您不想创建列表,您可以简单地:

for value in string.split(","):
     #Your code here...

for 循环将使用值 T00000000、T00000001、T00000003 ...

@python_student,这比最初的答案中解释的要多。根据您提出的问题的语法,您似乎正在使用 h5py 来读取 HDF5 文件。要有效地访问文件内容,您需要对 HDF5 和 h5py 有基本的了解。我建议从这里开始:h5py Quick Start Guide。此外,Whosebug 上有许多很好的问题和答案,其中包含详细信息和示例。

HDF5 文件有 2 个基本对象:

  • 数据集:类似数组的数据集合
  • :保存数据集和其他组的类似文件夹的容器

h5py,使用字典语法访问Group对象,使用NumPy语法读取Datasets。 (注意组对象不是 Python 字典 - 只是“看起来”像它们!)

如您所述,keys() 是文件根级别的对象(组或数据集)的名称。您的代码从组键创建了一个列表:list(file.keys())。一般来说,没有理由这样做。通常,您将遍历 keys()items() 而不是创建列表。

这是一个简短的代码段,展示了您可以如何执行此操作。一旦我对您的数据架构有了更多了解,我就可以添加更多详细信息。 (HDF5 是一个通用的数据容器,几乎具有任何模式。)

# loop on names:
for name in file.keys():
    print(name)
# loop on names and H5 objects:
for name, h5obj in file.items():
    if isinstance(h5obj,h5py.Group):
        print(name,'is a Group')
    elif isinstance(h5obj,h5py.Dataset):
        print(name,'is a Dataset')
        # return a np.array using dataset object:
        arr1 = h5obj[:]
        # return a np.array using dataset name:
        arr2 = file[name][:] 
        # compare arr1 to arr2 (should always return True):
        print(np.array_equal(arr1, arr2))