关闭打开的 h5py 数据文件

Posted

技术标签:

【中文标题】关闭打开的 h5py 数据文件【英文标题】:Close an open h5py data file 【发布时间】:2015-07-03 23:50:52 【问题描述】:

在我们的实验室中,我们通过 python 包 h5py 将数据存储在 hdf5 文件中。

在实验开始时,我们创建了一个hdf5 文件并在文件中的数据数组之后存储数组(以及其他内容)。当实验失败或中断时,文件未正确关闭。 因为我们的实验是从iPython 运行的,所以对数据对象的引用仍然(某处)在内存中。

有没有办法扫描所有打开的 h5py 数据对象并关闭它们?

【问题讨论】:

【参考方案1】:

这是可以做到的(我不知道如何检查文件的封闭性,没有例外,也许你会发现):

import gc
for obj in gc.get_objects():   # Browse through ALL objects
    if isinstance(obj, h5py.File):   # Just HDF5 files
        try:
            obj.close()
        except:
            pass # Was already closed

另一个想法:

取决于如何您使用这些文件,如何使用上下文管理器和 with 这样的关键字?

with h5py.File("some_path.h5") as f:
   f["data1"] = some_data

当程序流程退出with-block时,无论发生什么,包括异常等,文件都会关闭。

【讨论】:

感谢您提供有关“另一个想法”的信息。我只是在搜索以确保我的 h5py.Files 以“with”关闭【参考方案2】:

pytablesh5py 使用)跟踪所有打开的文件,并提供一种简单的方法来强制关闭所有打开的hdf5 文件。

import tables
tables.file._open_files.close_all()

该属性_open_files 也有一些有用的方法可以为您提供打开文件的信息和处理程序。

【讨论】:

谢谢,这正是我所需要的。由于某种原因,上一个答案对我不起作用,但无论如何这个答案要容易得多:-)【参考方案3】:

我发现 hFile.bool() 如果打开则返回 True,否则返回 False。这可能是最简单的检查方法。 换句话说,这样做:

hFile = h5py.File(path_to_file)
if hFile.__bool__():
       hFile.close()

【讨论】:

这似乎是真的,但是官方文档中是否有关于这种行为的描述?如果某些不相关的条件也影响 __bool__() 的值,则可能会有风险 不幸的是我不知道!

以上是关于关闭打开的 h5py 数据文件的主要内容,如果未能解决你的问题,请参考以下文章

用 h5py 创建的 HDF5 文件不能被 h5py 打开

如何使用 h5py 读取只有数据集(无组)的 HDF5 文件?

使用 h5py 沿新轴将数据添加到现有 h5py 文件

用于 Python 的 HDF5:高级与低级接口。 h5py

如何使用h5py读入数据

如何扩展 h5py 以便我可以访问 hdf5 文件中的数据?