我在python 2.7中使用h5py创建了一个文件。
这些步骤导致腐败:
我使用scp
从协作者下载了一份新的副本。它是整体和286MB。
我通过hdfview
打开它来检查它是否可读。这会正确显示所有数据集和组。
我退出hdfview。
重复步骤2和3以确保hdfview
不会损坏文件。
我打开ipython 3.6和
import h5py
f = h5py.File(filename,'r')
g = f['/sol000']#one group that should be there
我得到KeyError: "Unable to open object (Object 'sol000' doesn't exist)"
f.close()
并退出ipython。我再次用hdfview
打开它,整个结构都消失了。该文件现在是4KB。我能够在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()
答案 0 :(得分:0)
解决方案是强制执行libver=earliest
。即以下代码用于打开文件:
import h5py
f = f.File("file.hdf5","r",libver="earliest")
我发现h5py文档可能存在不一致之处。 It claims
“最早”选项意味着HDF5将尽最大努力 向后兼容。
默认为“最早”。
如果仅在我明确设置它时才有效。 事实证明,我的合作者使用旧版本的hdf5 C库创建了可破坏的文件。