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

Posted

技术标签:

【中文标题】用 h5py 创建的 HDF5 文件不能被 h5py 打开【英文标题】:HDF5 file created with h5py can't be opened by h5py 【发布时间】:2014-12-24 04:00:15 【问题描述】:

我在 Ubuntu 12.04(32 位版本)下创建了一个 HDF5 文件,显然没有任何问题,使用 Anaconda 作为 Python 发行版并在 ipython 笔记本中编写。底层数据都是 numpy 数组。例如,

import numpy as np
import h5py

f = h5py.File('myfile.hdf5','w')

group = f.create_group('a_group')

group.create_dataset(name='matrix', data=np.zeros((10, 10)), chunks=True, compression='gzip')

如果我尝试从新的 iython 笔记本打开此文件,我会收到一条错误消息:

f = h5py.File('myfile.hdf5', "r")

---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-4-b64ac5089cd4> in <module>()
----> 1 f = h5py.File(file_name, "r")

/home/sarah/anaconda/lib/python2.7/site-packages/h5py/_hl/files.pyc in __init__(self, name, mode, driver, libver, userblock_size, **kwds)
    220 
    221             fapl = make_fapl(driver, libver, **kwds)
--> 222             fid = make_fid(name, mode, userblock_size, fapl)
    223 
    224         Group.__init__(self, fid)

/home/sarah/anaconda/lib/python2.7/site-packages/h5py/_hl/files.pyc in make_fid(name, mode, userblock_size, fapl, fcpl)
     77 
     78     if mode == 'r':
---> 79         fid = h5f.open(name, h5f.ACC_RDONLY, fapl=fapl)
     80     elif mode == 'r+':
     81         fid = h5f.open(name, h5f.ACC_RDWR, fapl=fapl)

/home/sarah/anaconda/lib/python2.7/site-packages/h5py/h5f.so in h5py.h5f.open (h5py/h5f.c:1741)()

IOError: Unable to open file (Unable to find a valid file signature)

你能告诉我丢失的文件签名是什么吗?我创建文件时是否遗漏了什么?

【问题讨论】:

您在尝试再次打开之前是否f.close() 您的可写 文件?此外,您的示例代码不可执行:变量Mfrgroupfgroup_IDposMsgroupsgroup_IDnames 未定义。 在写入或写入文件时(使用任何文件构造函数,而不仅仅是 h5py)通常建议使用with statement。例如with h5py.File('myfile.hdf5', 'w') as f:。这样您就不必显式关闭文件。另一方面,它使得交互式调试文件 I/O 变得困难。 另外,您真的需要在数据集中创建所有这些变量来生成此错误吗?如果您只创建其中一个变量,您会得到同样的错误吗? 你是对的,我确实忘记f.close()文件!我通常使用with 语句,但这次遵循了一个教程,当然忘记了......你想为此写一个答案,还是我应该?还是有其他方法可以将此问题标记为已解决? 太棒了!我对 iPython 笔记本了解不多,但基于此错误,我猜测它们使用相同的解释器(内核/会话)。 This page 讨论了将内核与笔记本分开,这可能适合您的问题;即,也许您在此更改之前正在使用 iPy 笔记本?这些类型的事情可以记录在您提供的答案中。 【参考方案1】:

由于我们在我的问题上解决了 cmets 中的问题,因此我将结果写在这里以将其标记为已解决。

主要问题是我在创建文件后忘记关闭文件。会有两个简单的选择:

import numpy as np
import h5py

f = h5py.File('myfile.hdf5','w')
group = f.create_group('a_group')
group.create_dataset(name='matrix', data=np.zeros((10, 10)), chunks=True, compression='gzip')
f.close()

或者,我最喜欢的,因为文件会自动关闭:

import numpy as np
import h5py

with h5py.File('myfile.hdf5','w') as f:
    group = f.create_group('a_group')
    group.create_dataset(name='matrix', data=np.zeros((10, 10)), chunks=True, compression='gzip')

【讨论】:

对于因为遇到此错误而来到这里的人,我有一个一般性建议:“再次检查所有内容”。就我而言,它没有从 LFS 签出 .h5 文件。 (所以它包含 LFS 元数据而不是 HDF 数据)。很高兴知道这个问题的其他来源。 谢谢!知道还有什么会导致相同的错误消息总是很好。 我采取了以下第一种方法,但仍然出现与帖子中提到的相同的错误。让我展示一下我的代码... import h5py f = h5py.File(weight_path, mode='r') flattened_layers = model.layers nb_layers = f.attrs['nb_layers'] for k in range(nb_layers): g = f ['layer_'.format(k)] weights = [g['param_'.format(p)] for p in range(g.attrs['nb_params'])] 如果不是权重:继续 f。关闭() 也许您应该将其作为一个单独的问题发布,因为您的代码很难以这种方式阅读。【参考方案2】:

我正在使用 https://github.com/matterport/Mask_RCNN 并产生相同的错误:

    Traceback (most recent call last):
  File "detection.py", line 42, in <module>
    model.load_weights(model_path, by_name=True)
  File "/home/michael/Bachelor/important/Cable-detection/Mask_RCNN-2.1/samples/cable/mrcnn/model.py", line 2131, in load_weights
    f = h5py.File(filepath, mode='r')
  File "/home/michael/.local/lib/python3.6/site-packages/h5py/_hl/files.py", line 271, in __init__
    fid = make_fid(name, mode, userblock_size, fapl, swmr=swmr)
  File "/home/michael/.local/lib/python3.6/site-packages/h5py/_hl/files.py", line 101, in make_fid
    fid = h5f.open(name, flags, fapl=fapl)
  File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper (/tmp/pip-s_7obrrg-build/h5py/_objects.c:2840)
  File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper (/tmp/pip-s_7obrrg-build/h5py/_objects.c:2798)
  File "h5py/h5f.pyx", line 78, in h5py.h5f.open (/tmp/pip-s_7obrrg-build/h5py/h5f.c:2117)
OSError: Unable to open file (Addr overflow, addr = 800, size=8336, eoa=2144)
HDF5: infinite loop closing library
      D,T,F,FD,P,FD,P,FD,P,E,E,SL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL,FL

上面的解决方案也对我有用。我随机中断了训练,因此.hdf5文件没有正确关闭,之后无法打开。

【讨论】:

以上是关于用 h5py 创建的 HDF5 文件不能被 h5py 打开的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 无法读取使用 h5py 创建的 hdf5 文件

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

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

具有版本控制的 HDF5 文件 (h5py) - 每次保存时都会更改哈希

使用 h5py 删除 hdf5 数据集

使用 h5py 将光栅图像添加到 HDF5 文件