关闭打开的 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】:pytables
(h5py
使用)跟踪所有打开的文件,并提供一种简单的方法来强制关闭所有打开的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 文件?