使用 h5py 删除 hdf5 数据集

Posted

技术标签:

【中文标题】使用 h5py 删除 hdf5 数据集【英文标题】:Deleting hdf5 dataset using h5py 【发布时间】:2015-10-29 22:53:20 【问题描述】:

有没有办法从 hdf5 文件中删除数据集,最好使用 h5py?或者,是否可以在保持其他数据集不变的同时覆盖数据集?

据我了解,h5py 可以以 5 种模式读写 hdf5 文件

f = h5py.File("filename.hdf5",'mode')

其中模式可以是rfor read,r+ for read-write,a for read-write,但如果它不存在则创建一个新文件,wfor write/overwrite,和@ 987654326@ 与w 相同,但如果文件已存在则失败。我已经尝试了所有但似乎没有一个工作。

非常感谢任何建议。

【问题讨论】:

del h5py_file[dataset_address] 或者...,您可以创建一个新的 HDF5 文件并从旧文件中复制您需要的内容。 【参考方案1】:

是的,这可以做到。

with h5py.File(input,  "a") as f:
    del f[datasetname]

您需要以可写模式打开文件,例如追加(如上)或写入。

正如 @seppo-enarvi 在 cmets 中所指出的,之前推荐的目的 f.__delitem__(datasetname) 函数是实现 del 操作符,所以可以使用 del f[datasetname]

删除数据集

【讨论】:

__delitem__函数的目的是实现del操作符,这样就可以使用del f[datasetname]删除一个数据集。 @SeppoEnarvi 所以你是说语法应该是with h5py.File(input, "a") as f: del f[datasetname] 而不是上面写的? 我会使用del f[datasetname],因为它是在 Python 中删除对象的标准方法,这也是文档的建议。但它们可能都有效。 删除少量数据后文件大小保持不变。我尝试删除一个 6 GB 文件的一半数据,它的大小始终保持不变,请问这个问题可以解决吗? @Pratheeswaran,您可能需要使用 HDF 组的命令行实用程序之一重新打包文件,或者您可以将内容复制到新文件,然后用它替换现有文件。我相信由于 HDF5 使用的树结构,恢复空间并非易事。【参考方案2】:

我试过了,我实际上可以减小文件大小的唯一方法是将所有内容复制到一个新文件中,并忽略我不感兴趣的数据集:

fs = h5py.File('WFA.h5', 'r')
fd = h5py.File('WFA_red.h5', 'w')
for a in fs.attrs:
    fd.attrs[a] = fs.attrs[a]
for d in fs:
    if not 'SFS_TRANSITION' in d: fs.copy(d, fd)

【讨论】:

我建议根据一些假设进行编辑(SFS_TRANSITION 是您工作的特定内容?)以使您的答案更笼统,如果我误解了某些内容,请回滚【参考方案3】:

我不明白您的问题与文件打开模式有什么关系。对于读/写 r+ 是要走的路。

据我所知,删除并不容易/不可能,特别是无论您做什么,文件大小都不会缩小。

但是覆盖内容没问题

f['mydataset'][:] = 0

【讨论】:

【参考方案4】:

我想让您了解我的一位同事所做的一项开发并在开源中上线。它被称为h5nav。您可以使用 pip install (https://pypi.org/project/h5nav/) 下载它。

pip install h5nav

h5nav toto.h5
ls
rm the_group_you_want_to_delete
exit

请注意,您仍然必须使用 h5repack 来减小文件的大小。

最好, 杰罗姆

【讨论】:

以上是关于使用 h5py 删除 hdf5 数据集的主要内容,如果未能解决你的问题,请参考以下文章

使用 h5py 编写大型 hdf5 数据集

如何区分 HDF5 数据集和使用 h5py 的组?

如何使用 h5py 读取只有数据集(无组)的 HDF5 文件?

通过 h5py (HDF5) 写入具有可变长度字符串的复合数据集

HDF5 数据集数量限制

将更多数据集附加到现有 Hdf5 文件中,而不删除其他组和数据集