【问题标题】:Delete subgroup from HDF5 file in Python从 Python 中的 HDF5 文件中删除子组
【发布时间】:2016-07-19 15:25:56
【问题描述】:

我正在尝试删除我在 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 前后保持不变。

【问题讨论】:

    标签: python hdf5 h5py


    【解决方案1】:

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

    如果你使用with-statement,当Python离开with-statement时,myfile.close()会自动为你调用:

    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
    

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

    【讨论】:

    • 哦。我知道了。我忘了关闭文件。我实际上不太习惯使用“with”,但我真的很喜欢你这样做的方式。据我了解,with 总是会强制调用 exit 方法,对于 h5py.File 来说,它似乎是 close()?非常感谢你的好例子!
    • 是的,没错。 __exit__ 方法调用close()。 “从 h5py 2.0 开始,必须手动关闭文件,方法是调用“关闭”方法或使用文件对象作为上下文管理器。” (来自What's new in h5py version 2.0)。
    猜你喜欢
    • 2012-06-27
    • 2010-11-10
    • 2016-11-17
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2018-09-15
    相关资源
    最近更新 更多