如何使用低级Python API关闭HDF5?

时间:2016-10-11 23:16:48

标签: python anaconda hdf5 h5py

我能够通过结合以下Stack Overflow问题中定义的高级和低级Python h5py API来修改HDF5文件的缓存设置:How to set cache settings while using h5py high level interface?

我收到一条错误消息,说我在尝试重命名文件时仍然打开h5文件。 Python" with"在HDF5写入操作完成并刷新文件后,带有contextlib的语句似乎没有关闭文件。如何确保使用低级API或高级API关闭文件?你能举个例子吗?

import h5py
import contextlib
import os

filename = 'foo_2.h5'
propfaid = h5py.h5p.create(h5py.h5p.FILE_ACCESS)
settings = list(propfaid.get_cache())
settings[2] *= 5
propfaid.set_cache(*settings)

with h5py.File(filename, 'w') as hf:
    print 'file created'

with contextlib.closing(h5py.h5f.open(filename, fapl=propfaid)) as fid:

    f = h5py.File(fid)
    f.flush()

    # f.close() Seems to be working only in Python 3.4.3 but not in 2.7.7
    #and the "with contextlib.closing(...)  does not work on either version
    f.close()

os.rename(filename, 'foo_2.h5')

其他信息:
操作系统:Windows
Python:2.7.7
Anaconda分布:2.0.1
H5py版本:2.3.0

1 个答案:

答案 0 :(得分:0)

我认为你在寻找.close()

f.close()

虽然仔细观察,但我不确定为什么contextlib.closing(...)不起作用。

我将涉及contextlib的行编辑为:

with contextlib.closing(h5py.File(filename, fapl=propfaid)) as fid:

并删除

f = h5py.File(fid)

之后,我可以检查fid是否已关闭,并且重命名文件按预期工作。

print fid
<Closed HDF5 file>

os.rename(filename, 'foo2.hdf5')

没有错误,目录检查显示新名称