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

时间:2016-03-31 09:09:05

标签: python hdf5 h5py

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

del subgroup["MyDataset"] 

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

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之前和之后保持不变。

2 个答案:

答案 0 :(得分:3)

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

如果您使用with-statement,当Python离开myfile.close()时,系统会自动为您调用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({{1} },默认值)允许读取existant文件并进行修改。

答案 1 :(得分:-1)

来自文档:http://docs.h5py.org/en/latest/high/file.html#opening-creating-files

如果您使用 w 参数打开文件,则关闭文件时应截断该文件。

myfile = h5py.File('file1.hdf5', 'w')