使用h5py删除hdf5数据集

hsn*_*nee 18 python hdf5 dataset h5py

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

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

f = h5py.File("filename.hdf5",'mode')
Run Code Online (Sandbox Code Playgroud)

其中mode可以r用于读取,r+用于读写,a用于读写但是如果不存在则创建新文件,w用于写/覆盖, 如果文件已经存在,则该文件w-相同w但失败.我尝试了所有但似乎没有工作.

任何建议都非常感谢.

Ene*_*nes 32

是的,这可以做到.

with h5py.File(input,  "a") as f:
    del f[datasetname]
Run Code Online (Sandbox Code Playgroud)

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

正如@ seppo-enarvi在评论中所指出的,之前推荐的 f.__delitem__(datasetname) 函数 的目的是实现del 运算符,以便可以使用删除数据集 del f[datasetname]

  • `__delitem__`函数的目的是实现`del`运算符,以便可以使用`del f [datasetname]`删除数据集. (8认同)
  • 我会使用`del f [datasetname]`,因为它是删除Python中对象的标准方法,这也是文档建议的内容.但它们都可能奏效. (2认同)
  • 删除少量数据集后,文件大小保持不变。我尝试删除6 GB文件的一半数据,并且文件大小始终保持不变,是否可以解决? (2认同)
  • @Pratheeswaran,您可能需要使用 HDF 组的命令行实用程序之一重新打包文件,或者您可以将内容复制到新文件,然后用它替换现有文件。我相信由于 HDF5 使用的树结构,恢复空间并不是一件容易的事。 (2认同)

小智 5

我尝试了这个,我实际上可以减小文件大小的唯一方法是将所有内容复制到一个新文件中,而只留下我不感兴趣的数据集:

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)
Run Code Online (Sandbox Code Playgroud)