python h5py文件读取";OSError:无法打开文件(错误的超级块版本号)";

python h5py文件读取";OSError:无法打开文件(错误的超级块版本号)";,python,linux,windows,hdf5,h5py,Python,Linux,Windows,Hdf5,H5py,简短描述 我遇到一个问题,hdf5文件已在Windows计算机上写入,无法在Linux计算机上打开。错误消息为“OSError:无法打开文件(错误的超级块版本号)”。(因此,此问题可能与h5py完全无关,而是python文件open中的一般linux/windows兼容性问题) 详细描述 Windows和Linux上都使用了包含以下软件包的python虚拟环境: 烧瓶-0.12.2 烧瓶-RESTful-0.3.6 Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.1

简短描述

我遇到一个问题,hdf5文件已在Windows计算机上写入,无法在Linux计算机上打开。错误消息为“OSError:无法打开文件(错误的超级块版本号)”。(因此,此问题可能与h5py完全无关,而是python文件open中的一般linux/windows兼容性问题)

详细描述

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

  • 烧瓶-0.12.2
  • 烧瓶-RESTful-0.3.6
  • Jinja2-2.10
  • MarkupSafe-1.0
  • Werkzeug-0.14.1
  • aniso8601-3.0.0
  • 点击-6.7
  • h5py-2.7.1
  • h5py-cache-1.0
  • 其危险系数为-0.24
  • 锁文件-0.12.2
  • numpy-1.14.0
  • pytz-2018.3
  • 6-1.11.0
在Windows上,文件可以被打开和读取而不会出现问题,但在Linux上却不能,这会抛出一个操作系统错误。只需启动一个新的python会话并键入以下内容即可:

进口h5py

f1=h5py.File(“myfile.hdf5”、“r”)

完全错误:

回溯(最近一次呼叫最后一次):

模块中第1行的文件“stdin”

文件“/usr/local/lib/python3.6/site packages/h5py/_hl/files.py”,第312行,在_

文件“/usr/local/lib/python3.6/site packages/h5py/_hl/files.py”,第142行,在make_fid中

文件“h5py/_objects.pyx”,第54行,在h5py._objects.with_phil.wrapper中

文件“h5py/_objects.pyx”,第55行,在h5py._objects.with_phil.wrapper中

文件“h5py/h5f.pyx”,第78行,在h5py.h5f.open中

OSError:无法打开文件(错误的超级块版本号)

HDF5文件是在Windows机器上使用Java HDF5库从我无法修改的程序写入的,HDF5 Java 1.10.0处于SWMR(单写多读)模式

在将文件进一步发送到我的程序(一个轻量级Linux应用程序)之前,程序可能没有正确关闭文件

在中,“超级块的版本号”描述如下

此值用于确定超级块中信息的格式。当超级块中信息的格式更改时,版本号将增加到下一个整数,并可用于确定超级块中信息的格式

为该字段定义了0和1的值

此字段存在于超级块的0+版本中

…这并不能帮助我理解错误的superblock版本号可能是什么原因

下面是我试图打开的一个示例文件:

为什么要把这个问题变成堆栈溢出问题?

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

采取的行动

  • 升级到h5py到2.8.0rc1并不能解决此问题
  • 其他HDF5文件可以按预期打开
相关主题

出于可能的原因,我查看了以下主题和网站,但都是空手而归:

(一)

(二)

(三)

(四)

(五)

编辑1:


多亏了@Tom de Geus,我在Linux和Windows上尝试了HDF视图,发现示例文件无法在Linux HDF视图上打开,但可以使用Windows HDF视图打开。这表明问题在于文件和HDF,而不是h5py。

感谢Pierre de Buyl确认该文件确实可以在Linux上以正确的HDF版本1.10.0打开。在Windows上,我运行的是HDF1.10.1(通过h5py安装),但在Linux上,h5py的默认安装为1.8.18。在使用cmake从源代码构建HDF之后,我也能够在Linux上打开该文件,版本为1.10.0或更高版本

使用cmake安装HDF 1.10.0的指南:

错误消息“OSError:无法打开文件(错误的超级块版本号)”令人困惑,但似乎表明旧版本的HDF(1.8.18)未配置为识别HDF 1.10.0版写入的新超级块版本号


感谢您的帮助汤姆·德·盖斯和皮埃尔·德·布伊尔:)

您试过和我一起阅读吗?或任何API?在具有HDF视图的Windows上,它会正确打开文件,但会为每个数据集显示红色的“警告倒置三角形”,而在我的Linux计算机上可以使用h5py.file(“myfile.hdf5”,“r”)成功打开的其他hdf5文件中则不是这种情况。但是,在具有HDF视图的Linux上,无法打开该文件,并显示一个非信息性的“打开文件myfile.hdf5时出错”,这很有趣。问题似乎是HDF本身,而不是h5py。我已经下载了您的示例文件,并且可以在Linux下使用h5py打开它而不会出现任何问题
h5py.version.hdf5\u version
1.10.0
。您正在运行什么Linux?我们无法在Ubuntu 16.04和Ubuntu Gnome 16.04上打开它。看来我一直在运行的h5py版本是1.8.18,谢谢你帮助Pierre,我会确保升级,看看我的位置。这确实是一个版本不兼容的问题,谢谢Pierre de Buyl!我被试图打开文件时提供的错误消息弄糊涂了,但升级到1.10.0后,文件会正确打开。
fid = make_fid(name, mode, userblock_size, fapl, swmr=swmr)
fid = h5f.open(name, flags, fapl=fapl)