使用h5py创建的HDF5文件无法被h5py打开。

23

我在Ubuntu 12.04(32位版本)下使用Anaconda作为Python发行版,在ipython笔记本中编写,似乎毫无问题地创建了一个HDF5文件。底层数据都是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')

如果我尝试从一个新的iypthon笔记本打开这个文件,然而,我会收到一个错误信息:

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)

你能告诉我那个缺失的文件签名是什么吗?在我创建这个文件时有些遗漏吗?


6
在尝试重新打开可写文件之前,你是否使用f.close()关闭了它?此外,你的示例代码无法执行:变量'Mfrgroup'、'fgroup_ID'、'pos'、'Msgroup'、'sgroup_ID'和'names'未定义。 - farenorth
2
通常建议在写入或从文件中读取时(使用任何文件构造函数,而不仅仅是h5py),使用“with”语句。例如:with h5py.File('myfile.hdf5', 'w') as f:。这样可以避免显式关闭文件。但另一方面,它使得交互式调试文件I/O变得困难。 - farenorth
1
另外,你真的需要创建数据集中所有这些变量来生成此错误吗?如果只创建其中一个变量,是否会得到相同的错误? - farenorth
2
你说得对,我确实忘记了 f.close() 关闭文件!我通常使用 with 语句,但这次按照教程操作,当然就忘了... 你想回答这个问题,还是我来?或者有其他方法标记此问题已解决吗? - Lilith-Elina
1
太好了!我对iPython笔记本不是很了解,但根据这个错误,我猜测它们使用相同的解释器(内核/会话)。这个页面讨论了如何将内核与笔记本分离,这可能与您的问题相关;也就是说,也许您在进行此更改之前使用的是iPy笔记本?这些类型的事情可以在您提供的答案中记录。 - farenorth
显示剩余3条评论
2个回答

36

由于在我的问题的评论中解决了该问题,我在此将结果写出以标记为已解决。

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

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')

1
对于因为遇到这个错误而来到这里的人,我有一个通用建议:“再次检查一切”。在我的情况下,问题出在没有从LFS签出.h5文件(因此它包含了LFS元数据而不是HDF数据)。很高兴知道其他导致这个问题的来源。 - Tomasz Gandor
谢谢!了解其他引起相同错误消息的原因总是很好的。 - Lilith-Elina
我已经尝试了以下第一种方法,但仍然出现了帖子中提到的相同错误。让我展示我的代码...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'])] if not weights: continue f.close() - Rahul Modi
1
也许你应该将其作为一个单独的问题发布,因为以这种方式阅读你的代码非常困难。 - Lilith-Elina

3
我曾经使用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文件没有正常关闭,之后就无法打开。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接