我正在尝试使用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之前和之后保持不变。
答案 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')