使用h5py删除hdf5数据集

29
有没有办法从一个hdf5文件中删除数据集,最好使用h5py?或者,是否有可能在保持其他数据集完整的情况下覆盖一个数据集?
据我了解,h5py可以以5种模式读/写hdf5文件。
f = h5py.File("filename.hdf5",'mode')

模式可以是r表示读取,r + 表示读取/写入,a表示读取/写入但如果文件不存在则创建一个新文件,w表示写入/覆盖,w-w相同,但如果文件已经存在则失败。我尝试了所有这些选项,但似乎都不起作用。

非常感谢任何建议。


2
del h5py_file[dataset_address] - william_grisaitis
或者,您可以创建一个新的HDF5文件,并从旧文件中复制所需内容。 - Stardust
4个回答

58

可以的。

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

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

正如在评论中@seppo-enarvi所指出的那样,先前推荐的 f.__delitem__(datasetname) 函数的目的是实现 del 操作符,因此可以使用 del f[datasetname] 删除数据集。


8
__delitem__ 函数的目的是实现 del 运算符,以便可以使用 del f[datasetname] 删除数据集。 - Seppo Enarvi
@SeppoEnarvi,你是在说语法应该是 with h5py.File(input, "a") as f: del f[datasetname] 而不是上面写的吗? - DeeWBee
2
我会使用 del f[datasetname],因为这是Python中删除对象的标准方式,文档也建议使用这种方式。但它们两个都可能有效。 - Seppo Enarvi
7
删除一些数据集后,文件大小仍然保持不变。我尝试删除了一个6 GB文件中一半的数据,但它的大小始终没有改变,这个问题有解决方法吗? - Pratheeswaran
2
@Pratheeswaran,您可能需要使用HDF组的命令行实用程序重新打包文件,或者将内容复制到新文件中,然后用其替换现有文件。我认为由于HDF5使用的树结构,恢复空间并不是一件简单的事情。 - EnemyBagJones

6

我尝试了这个方法,唯一能够减小文件大小的方式是将所有内容复制到一个新文件中,然后省略我不感兴趣的数据集:

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)

1
我基于一些假设提出了一个编辑建议(SFS_TRANSITION是你工作中的某个特定内容吗?),以使你的回答更加通用。如果我有什么误解,请回滚。 - llama

0

我不明白你的问题与文件打开模式有什么关系。对于读/写操作,r+ 是最好的选择。

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

但覆盖内容没有问题。

f['mydataset'][:] = 0

0

我想让你知道我的一个同事开发并在开源平台上发布的一个项目,它叫做h5nav。你可以通过pip install (https://pypi.org/project/h5nav/)来下载它。

pip install h5nav

h5nav toto.h5
ls
rm the_group_you_want_to_delete
exit

请注意,您仍然需要使用h5repack来降低文件大小。
最好的祝福, 杰罗姆

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接