Python h5py文件读取出现"OSError: Unable to open file (bad superblock version number)"错误

7

简要说明

我的问题是,在Windows机器上编写了一个hdf5文件,但在Linux机器上无法打开。错误消息是“OSError:无法打开文件(坏的超级块版本号)”。(因此,这个问题可能与h5py无关,而是Python文件打开时一般的Linux / Windows兼容性问题)。

详细说明

在Windows和Linux上都使用了以下软件包的Python虚拟环境:

  • Flask-0.12.2
  • Flask-RESTful-0.3.6
  • Jinja2-2.10
  • MarkupSafe-1.0
  • Werkzeug-0.14.1
  • aniso8601-3.0.0
  • click-6.7
  • h5py-2.7.1
  • h5py-cache-1.0
  • itsdangerous-0.24
  • lockfile-0.12.2
  • numpy-1.14.0
  • pytz-2018.3
  • six-1.11.0
在Windows上,该文件可以被打开和读取,但在Linux上无法进行,会抛出OSError。只需启动新的Python会话并输入以下内容即可:

import h5py

f1 = h5py.File("myfile.hdf5", "r")

完整错误信息:

Traceback (most recent call last):

File "stdin", line 1, in module

File "/usr/local/lib/python3.6/site-packages/h5py/_hl/files.py", line 312, in _ _ init_ _

fid = make_fid(name, mode, userblock_size, fapl, swmr=swmr)

File "/usr/local/lib/python3.6/site-packages/h5py/_hl/files.py", line 142, in make_fid

fid = h5f.open(name, flags, fapl=fapl)

File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper

File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper

File "h5py/h5f.pyx", line 78, in h5py.h5f.open

OSError: Unable to open file (bad superblock version number)

HDF5文件是使用Java HDF5库从Windows机器上的程序编写的,我无法修改它,使用的是hdf5 java 1.10.0以SWMR(单写多读)模式。可能该程序在将文件发送给我的轻量级Linux应用程序之前未正确关闭文件。在http://web.mit.edu/fwtools_v3.1.0/www/H5.format.html中,"超级块版本号"描述如下...这并不能帮助我理解错误的超级块版本号是什么意思。

这是我要打开的一个示例文件: https://drive.google.com/open?id=10hpbWj4HBwIMq0X6Rq7yVzJATOiYHJcc

为什么要把这个问题发到stackoverflow上?

这个问题可能会影响所有在Linux机器上想要读取在Windows机器上生成的未正确关闭/格式化等hdf5文件的人。我想知道为什么会出现这种情况,以及如何在我的Linux端解决这个问题。如果唯一的解决办法是“需要由生成HDF5文件的Windows程序进行修复,因为之后无法修复”,那么这也是可以接受的答案。这是这里的情况吗?

已采取的措施

  • 升级到h5py 2.8.0rc1不能解决这个问题
  • 其他HDF5文件可以正常打开

相关主题

我查看了以下主题和网站,以寻找可能的原因,但没有发现任何线索:
1) https://support.hdfgroup.org/HDF5/faq/bkfwd-compat.html 2) h5py OSError:无法打开文件(未找到文件签名) 3) 使用h5py创建的HDF5文件无法被h5py打开 4) https://github.com/h5py/h5py/issues/757 5) http://web.mit.edu/fwtools_v3.1.0/www/H5.format.html 编辑1:

感谢@Tom de Geus的帮助,我在Linux和Windows上尝试了HDF View,并发现示例文件无法在Linux HDF View上打开,但可以使用Windows HDF View打开。这表明问题出现在文件和HDF上,而不是h5py。


你尝试过使用HDF View阅读吗?或者使用任何API? - Tom de Geus
在Windows上使用HDF View打开文件时,它可以正确地打开文件,但是对于每个数据集都显示红色的“倒置三角形”警告,而在我的Linux机器上可以成功地使用h5py.File("myfile.hdf5", "r")打开其他hdf5文件时并不会出现这种情况。在Linux上使用HDF View时,无法打开该文件,并显示一个不太有用的“Error opening file myfile.hdf5”错误信息,这很有趣。问题似乎是HDF本身而不是h5py。 - Mierpo
1
我已经下载了你的示例文件,并且在使用h5py在Linux下能够无问题地打开它。h5py.version.hdf5_version1.10.0 - Pierre de Buyl
你用的是哪个Linux系统?我们无法在Ubuntu 16.04和Ubuntu Gnome 16.04上打开它。看起来我一直在使用的h5py版本是1.8.18,谢谢Pierre的帮助,我会确保升级并查看结果。 - Mierpo
这确实是一个版本不兼容的问题,谢谢Pierre de Buyl!当我尝试打开文件时,错误信息让我感到困惑,但在升级到1.10.0之后,文件可以正确打开。 - Mierpo
1个回答

2
感谢Pierre de Buyl确认该文件确实可以在Linux上使用正确的HDF版本1.10.0打开。在Windows上,结果表明我正在运行HDF 1.10.1(通过h5py安装),但是在Linux上,h5py的默认安装为1.8.18。通过使用cmake从源代码构建HDF后,我也能够在Linux上打开该文件,版本为1.10.0或更高版本。
安装HDF 1.10.0的指南: https://support.hdfgroup.org/HDF5/release/cmakebuild.html 错误消息“OSError:无法打开文件(坏的超级块版本号)”令人困惑,但似乎表明旧版本的HDF(1.8.18)未配置为识别由HDF版本1.10.0编写的新超级块版本号。
感谢Tom de Geus和Pierre de Buyl的帮助 :)

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