我正在使用 h5py 修复 python 脚本。它包含这样的代码:
hdf = h5py.File(hdf5_filename, 'a')
...
g = hdf.create_group('foo')
g.create_dataset('bar', ...whatever...)
Run Code Online (Sandbox Code Playgroud)
有时这会在已经有一个名为“foo”的组的文件上运行,在这种情况下,我会看到“ValueError: Unable to create group (Name already exists)”
解决此问题的一种方法是用四行替换带有 create_group 的简单行,如下所示:
if 'foo' in hdf.keys():
g = hdf['foo']
else:
g = hdf.create_group['foo']
g.create_dataset(...etc...)
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方法来做到这一点,也许只有一行?就像标准 C 库中的文件一样,'a' 模式要么附加到现有文件,要么创建一个文件(如果它不存在)。
数据集也是如此 - 我有
create_dataset('bar', ...)
Run Code Online (Sandbox Code Playgroud)
但应该先检查:
if 'bar' in g.keys():
d = g['bar']
else:
d = g.create_dataset('bar')
Run Code Online (Sandbox Code Playgroud)
我的愿望:找到 h5py 有名为 create_or_use_group() 和 create_or_use_dataset() 的方法。什么是实际存在的?
是:require_group和require_dataset:
with h5py.File("/tmp/so_hdf5/test2.h5", 'w') as f:
a = f.create_dataset('a',data=np.random.random((10, 10)))
with h5py.File("/tmp/so_hdf5/test2.h5", 'r+') as f:
a = f.require_dataset('a', shape=(10, 10), dtype='float64')
d = f.require_dataset('d', shape=(20, 20), dtype='float64')
g = f.require_group('foo')
print(a)
print(d)
print(g)
Run Code Online (Sandbox Code Playgroud)
请注意,您确实需要知道数据集的形状和数据类型,否则require_dataset会抛出TypeError. 在这种情况下,你可以这样做:
try:
a = f.require_dataset('a', shape=(10, 10), dtype='float64')
except TypeError:
a = f['a']
Run Code Online (Sandbox Code Playgroud)
如果您还不知道形状和数据类型,我认为require_dataset使用try ... except ...