使用 h5py py2 制作的 hdf5 在 py3 中使用 h5py 打开后损坏
Posted
技术标签:
【中文标题】使用 h5py py2 制作的 hdf5 在 py3 中使用 h5py 打开后损坏【英文标题】:hdf5 made with h5py py2 corrupted after opening with h5py in py3 【发布时间】:2017-10-02 14:09:00 【问题描述】:问题
我在 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()
【问题讨论】:
您是否尝试过用一个(从头开始)创建一个简单的 hdf5 文件并用另一个打开?沿着minimal reproducible example 的路线。里面可以有unicode字符串吗? 我有来自合作者的第二个 hdf5 文件,它工作正常。但是,我问他是否使用了不同的 python/h5py 组合来创建它。如果使用相同的版本,则它满足最低可验证标准。 如果它不能从您的问题中复制粘贴,则它不是 MCVE。 我已经添加了这个。 您的编辑表明此示例有效。我们期望它能够工作。你需要一个可重复的例子,打破;那是 MCVE 中的 C。 【参考方案1】:解决方案是强制执行libver=earliest
。 IE。以下代码可以打开文件:
import h5py
f = f.File("file.hdf5","r",libver="earliest")
我发现 h5py 文档中可能存在不一致之处。 It claims那个
“最早”选项意味着 HDF5 将尽最大努力成为 向后兼容。
默认为“最早”。
如果它只在我明确设置时才有效,那就不可能了。 事实证明,我的合作者使用旧版本的 hdf5 C 库创建了可损坏的文件。
【讨论】:
以上是关于使用 h5py py2 制作的 hdf5 在 py3 中使用 h5py 打开后损坏的主要内容,如果未能解决你的问题,请参考以下文章