用h5

时间:2017-10-02 14:09:01

标签: python python-2.7 python-3.x corruption h5py

问题

我在python 2.7中使用h5py创建了一个文件。

这些步骤导致腐败:

  1. 我使用scp从协作者下载了一份新的副本。它是整体和286MB。

  2. 我通过hdfview打开它来检查它是否可读。这会正确显示所有数据集和组。

  3. 我退出hdfview。

  4. 重复步骤2和3以确保hdfview不会损坏文件。

  5. 我打开ipython 3.6和

    import h5py f = h5py.File(filename,'r') g = f['/sol000']#one group that should be there

  6. 我得到KeyError: "Unable to open object (Object 'sol000' doesn't exist)"

    1. f.close()并退出ipython。我再次用hdfview打开它,整个结构都消失了。该文件现在是4KB。
    2. 我能够在python 2 hdf5中打开文件并访问所有数据集,但必须使用python 3作为我的代码。

      系统

      在Fedora 24上创建的文件64位,python 2.7,hdf5 2.7.0

      系统尝试在Fedora 25 64位python 3.6,h5py 2.7.0

      上读取它

      显示最小代码

      在系统1上:

      import h5py
      import numpy as np
      f = h5py.File("file.hdf5","w")
      f.create_dataset("/sol000/data",(100,100),dtype=float)
      f["/sol000/data"] = np.zeros([100,100],dtype=float)
      f.close()
      

      在系统2上:执行步骤1-4。

      import h5py
      f = h5py.File("file.hdf5","r")
      f.visit(lambda *x:print(x))
      #(sol000/data,)
      f.close()
      

1 个答案:

答案 0 :(得分:0)

解决方案是强制执行libver=earliest。即以下代码用于打开文件:

import h5py
f = f.File("file.hdf5","r",libver="earliest")

我发现h5py文档可能存在不一致之处。 It claims

  

“最早”选项意味着HDF5将尽最大努力   向后兼容。

     

默认为“最早”。

如果仅在我明确设置它时才有效。 事实证明,我的合作者使用旧版本的hdf5 C库创建了可破坏的文件。