如何使用 h5py 区分 HDF5 数据集和组?
How to differentiate between HDF5 datasets and groups with h5py?
我使用 Python 包 h5py(版本 2.5.0)访问我的 hdf5 文件。
我想遍历文件的内容并对每个数据集做一些事情。
使用visit
方法:
import h5py
def print_it(name):
dset = f[name]
print(dset)
print(type(dset))
with h5py.File('test.hdf5', 'r') as f:
f.visit(print_it)
对于我获得的测试文件:
<HDF5 group "/x" (1 members)>
<class 'h5py._hl.group.Group'>
<HDF5 dataset "y": shape (100, 100, 100), type "<f8">
<class 'h5py._hl.dataset.Dataset'>
这告诉我文件中有一个数据集和一个组。但是,除了使用 type()
来区分数据集和组之外,没有明显的方法。不幸的是,h5py documentation 并没有提及这个话题。他们总是假定您事先知道什么是组以及什么是数据集,例如因为他们自己创建了数据集。
我想要这样的东西:
f = h5py.File(..)
for key in f.keys():
x = f[key]
print(x.is_group(), x.is_dataset()) # does not exist
在使用 h5py 读取 Python 中的未知 hdf5 文件时,如何区分组和数据集?如何获取所有数据集、所有组、所有链接的列表?
不幸的是,在 h5py api 中没有内置的方法来检查这个,但是你可以简单地用 is_dataset = isinstance(item, h5py.Dataset)
.
检查项目的类型
要列出文件的所有内容(尽管文件的属性除外),您可以将 Group.visititems
与一个可调用项一起使用,该可调用项采用项目的名称和实例。
因为 h5py 使用 python 字典作为其选择的交互方法,您需要使用 "values()" 函数来实际访问项目。所以您可以使用列表过滤器:
datasets = [item for item in f["Data"].values() if isinstance(item, h5py.Dataset)]
递归地做这个应该很简单。
虽然 Gall 和 James Smith 的回答大体上表明了解决方案,但仍然需要遍历分层 HDF 结构并过滤所有数据集。我使用 yield from
完成了它,它在 Python 3.3+ 中可用,它工作得很好,并在此处展示它。
import h5py
def h5py_dataset_iterator(g, prefix=''):
for key, item in g.items():
path = '{}/{}'.format(prefix, key)
if isinstance(item, h5py.Dataset): # test for dataset
yield (path, item)
elif isinstance(item, h5py.Group): # test for group (go down)
yield from h5py_dataset_iterator(item, path)
with h5py.File('test.hdf5', 'r') as f:
for (path, dset) in h5py_dataset_iterator(f):
print(path, dset)
我更喜欢这个解决方案。它找到hdf5文件"h5file"中所有对象的列表,然后根据class对它们进行排序,类似于前面提到的但不是这样简洁的方式:
import h5py
fh5 = h5py.File(h5file,'r')
fh5.visit(all_h5_objs.append)
all_groups = [ obj for obj in all_h5_objs if isinstance(fh5[obj],h5py.Group) ]
all_datasets = [ obj for obj in all_h5_objs if isinstance(fh5[obj],h5py.Dataset) ]
例如,如果要打印 HDF5
文件的结构,可以使用以下代码:
def h5printR(item, leading = ''):
for key in item:
if isinstance(item[key], h5py.Dataset):
print(leading + key + ': ' + str(item[key].shape))
else:
print(leading + key)
h5printR(item[key], leading + ' ')
# Print structure of a `.h5` file
def h5print(filename):
with h5py.File(filename, 'r') as h:
print(filename)
h5printR(h, ' ')
例子
>>> h5print('/path/to/file.h5')
file.h5
test
repeats
cell01: (2, 300)
cell02: (2, 300)
cell03: (2, 300)
cell04: (2, 300)
cell05: (2, 300)
response
firing_rate_10ms: (28, 30011)
stimulus: (300, 50, 50)
time: (300,)
我使用 Python 包 h5py(版本 2.5.0)访问我的 hdf5 文件。
我想遍历文件的内容并对每个数据集做一些事情。
使用visit
方法:
import h5py
def print_it(name):
dset = f[name]
print(dset)
print(type(dset))
with h5py.File('test.hdf5', 'r') as f:
f.visit(print_it)
对于我获得的测试文件:
<HDF5 group "/x" (1 members)>
<class 'h5py._hl.group.Group'>
<HDF5 dataset "y": shape (100, 100, 100), type "<f8">
<class 'h5py._hl.dataset.Dataset'>
这告诉我文件中有一个数据集和一个组。但是,除了使用 type()
来区分数据集和组之外,没有明显的方法。不幸的是,h5py documentation 并没有提及这个话题。他们总是假定您事先知道什么是组以及什么是数据集,例如因为他们自己创建了数据集。
我想要这样的东西:
f = h5py.File(..)
for key in f.keys():
x = f[key]
print(x.is_group(), x.is_dataset()) # does not exist
在使用 h5py 读取 Python 中的未知 hdf5 文件时,如何区分组和数据集?如何获取所有数据集、所有组、所有链接的列表?
不幸的是,在 h5py api 中没有内置的方法来检查这个,但是你可以简单地用 is_dataset = isinstance(item, h5py.Dataset)
.
要列出文件的所有内容(尽管文件的属性除外),您可以将 Group.visititems
与一个可调用项一起使用,该可调用项采用项目的名称和实例。
因为 h5py 使用 python 字典作为其选择的交互方法,您需要使用 "values()" 函数来实际访问项目。所以您可以使用列表过滤器:
datasets = [item for item in f["Data"].values() if isinstance(item, h5py.Dataset)]
递归地做这个应该很简单。
虽然 Gall 和 James Smith 的回答大体上表明了解决方案,但仍然需要遍历分层 HDF 结构并过滤所有数据集。我使用 yield from
完成了它,它在 Python 3.3+ 中可用,它工作得很好,并在此处展示它。
import h5py
def h5py_dataset_iterator(g, prefix=''):
for key, item in g.items():
path = '{}/{}'.format(prefix, key)
if isinstance(item, h5py.Dataset): # test for dataset
yield (path, item)
elif isinstance(item, h5py.Group): # test for group (go down)
yield from h5py_dataset_iterator(item, path)
with h5py.File('test.hdf5', 'r') as f:
for (path, dset) in h5py_dataset_iterator(f):
print(path, dset)
我更喜欢这个解决方案。它找到hdf5文件"h5file"中所有对象的列表,然后根据class对它们进行排序,类似于前面提到的但不是这样简洁的方式:
import h5py
fh5 = h5py.File(h5file,'r')
fh5.visit(all_h5_objs.append)
all_groups = [ obj for obj in all_h5_objs if isinstance(fh5[obj],h5py.Group) ]
all_datasets = [ obj for obj in all_h5_objs if isinstance(fh5[obj],h5py.Dataset) ]
例如,如果要打印 HDF5
文件的结构,可以使用以下代码:
def h5printR(item, leading = ''):
for key in item:
if isinstance(item[key], h5py.Dataset):
print(leading + key + ': ' + str(item[key].shape))
else:
print(leading + key)
h5printR(item[key], leading + ' ')
# Print structure of a `.h5` file
def h5print(filename):
with h5py.File(filename, 'r') as h:
print(filename)
h5printR(h, ' ')
例子
>>> h5print('/path/to/file.h5')
file.h5
test
repeats
cell01: (2, 300)
cell02: (2, 300)
cell03: (2, 300)
cell04: (2, 300)
cell05: (2, 300)
response
firing_rate_10ms: (28, 30011)
stimulus: (300, 50, 50)
time: (300,)