从 Python 中的 HDF5 文件中删除子组

Delete subgroup from HDF5 file in Python

我正在尝试删除我在 Python 中使用 h5py 在 HDF5 文件中写入的子组。例如,根据文档,可以删除名为 "MyDataset" 的子组:

del subgroup["MyDataset"] 

我做到了,实际上该子组不再可访问。但是,文件不会减小其大小。我的问题是,是否可以使用 h5py 从已删除的子组中恢复 space 而不必将剩余的子组重写到一个全新的文件中?下面我提供一个小例子来说明我在说什么:

import numpy as np
import h5py

myfile = h5py.File('file1.hdf5')
data = np.random.rand(int(1e6))
myfile.create_dataset("MyDataSet", data=data)
myfile.close()

然后我打开文件并删除之前的条目:

myfile = h5py.File('file1.hdf5')
del myfile["MyDataSet"]

如果您尝试使用以下方法获取数据:

myfile["MyDataSet"].value

您将意识到数据不再可访问。但是,如果您检查文件的大小,它在调用 del 之前和之后保持不变。

del myfile["MyDataSet"] 修改 File 对象,但不修改基础 file1.hdf5 文件。在调用 myfile.close() 之前,file1.hdf5 文件不会被修改。

如果您使用 with-statementmyfile.close() 将在 Python 离开 with-statement 时自动为您调用:

import numpy as np
import h5py
import os

path = 'file1.hdf5'
with h5py.File(path, "w") as myfile:
    data = np.random.rand(int(1e6))
    myfile.create_dataset("MyDataSet", data=data)
    print(os.path.getsize(path))

with h5py.File(path, "a") as myfile:
    del myfile["MyDataSet"]
    try:
        myfile["MyDataSet"].value
    except KeyError as err:
        # print(err)
        pass

print(os.path.getsize(path))

打印

8002144         <-- original file size
2144            <-- new file size

请注意,第一次以写入模式打开 File ("w") 会创建一个新文件,第二次以追加模式打开 File ("a",默认)允许读取现有文件并修改它。