使用 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 打开后损坏的主要内容,如果未能解决你的问题,请参考以下文章

使用 h5py 删除 hdf5 数据集

使用 H5Py 在 HDF5 中存储日期时间

用于 Python 的 HDF5:高级与低级接口。 h5py

用 h5py 创建的 HDF5 文件不能被 h5py 打开

使用 h5py 对 hdf5 进行增量写入

如何使用“h5py”调整 HDF5 数组的大小