H5PY中打开文件出错(未找到文件签名)

46

我一直在使用以下代码来使用H5PY在Python中打开由MATLAB生成的一些HDF5文件:

import h5py as h5
data='dataset.mat'
f=h5.File(data, 'r')

然而我遇到了以下错误:

OSError: Unable to open file (File signature not found)

我已经检查过我要打开的文件是7.3版本的MAT文件,并且是HDF5格式。事实上,我之前已经成功使用H5PY打开了同样的文件。我确认这些文件存在并且可以访问,所以我不确定错误来自哪里。非常感谢您提供任何建议,提前致谢:)


我猜你试图打开HDF v.4文件。 HDF5文件的扩展名为“hdf5”或“h5”。 - Serenity
7个回答

25

通常情况下,消息文件签名未找到表示:

1. 您的文件已损坏。

我认为这是最有可能的情况。您说您以前曾打开过这些文件。也许您忘记了关闭文件句柄,这可能会破坏文件。尝试使用HDF5实用程序h5debug检查文件(如果您在操作系统上安装了hdf5库,则在命令行中可用。在Linux上使用dpkg -s libhdf5-dev进行检查)。

2. 文件不是HDF5格式。

这是您出现错误消息的已知原因。但由于您说过您确认了这种情况并且以前已经打开过文件,我只是为其他可能遇到此问题的人提供参考:

自2015年12月起(从版本7.3开始),Matlab文件在其MAT-File Level 5 Containers(更多文档)中使用基于HDF5的格式。早期版本的MAT文件(v4(Level 1.0)、v6和v7到7.2)由scipy库支持并可读取:

import scipy.io
f = scipy.io.loadmat('dataset.mat')
否则,您可以尝试其他方法并查看错误是否仍然存在: PyTables是h5py的一种替代方案,可以在这里找到。
import tables
file = tables.open_file('test.mat')

安装方式:

pip install tables

Python MATLAB Engine是读取MAT文件的替代方案,如果您已经安装了Matlab。文档在这里找到:MATLAB Engine API for Python

import matlab.engine
mat = matlab.engine.start_matlab()
f = mat.load("dataset.mat", nargout=1)

10

我遇到了与我的.h5文件相同的问题。问题在于我没有正确地下载.h5文件。

我做的是将filename.h5->右键点击->另存为,这种方式并没有正确地下载文件(可能是文件损坏了)。相反,我按照以下步骤下载文件:选中带有filename.h5的复选框,然后点击下载,之后我的代码就可以运行了。

也许这能帮助那些犯同样错误的人。


2

如果有人在Jupyter中遇到这个问题,您只需点击文件的复选框,然后点击下载按钮即可。我从这里得到了这个解决方案,希望它能帮助到你们。


2
通常情况下,这是由于文件损坏所致。我遇到过这个问题,重新下载文件后问题得到解决。

0

使用命令 tar -czvf zipfilename.tar.gz weightsfile 压缩文件对我很有效。


0
这不是每个人的解决方案,但如果你把数据保存在云端,比如Dropbox,并且忘记了它,那么当你尝试打开它时就会出现这个错误。
数据文件变得很大,我经常将旧工作的文件夹放到只能在线访问的位置,然后几个月后再次运行代码时就会忘记...
所以,确保你要访问的任何内容都设置为“离线可用”或者使用你的云存储等效功能,这样错误就会消失。

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community
我刚刚在遇到这个问题后又一次谷歌搜索,结果发现了我自己之前在Stack Overflow上的回答,而我竟然没有意识到这一点...我真是学不乖啊... - undefined

0
尝试其他开关。最好的一个是 r+:
forecast_dataset = h5py.File(data_path, 'r+')

文件名可以是字节字符串或Unicode字符串。有效的模式有:
- `r`:只读,文件必须存在(默认) - `r+`:读/写,文件必须存在 - `w`:创建文件,如果存在则截断 - `w-` 或 `x`:创建文件,如果存在则失败 - `a`:如果存在则读/写,否则创建

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接