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))
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))