根本原因可能是 【文件被你之前的读取或者其他操作损坏了】。文件已发生改变,和之前不一样。从而读不出来。在windows下可以用certutil校验一下原始文件和现在的文件是否有变化。甚至可以从文件大小上就能轻易判断出来!linux ubuntu可以用md5sum校验。
推荐的解决方法:重新获取原始文件。
只要文件是没有问题的,可能不管用scipy.io还是h5py都能打开。
----------------------------------------------------------------------------------------------------------------
python3读取.mat文件:
from scipy import io
mat_file = r'/home/data/1.mat'
io.loadmat(mat_file)
报错:
Traceback (most recent call last):
File "/home/user1/test.py", line 78, in
show_mat(mat)
File "/home/user1/test.py", line 50, in show_mat_flow
x = io.loadmat(mat_file)
File "/home/user1/.local/lib/python3.6/site-packages/scipy/io/matlab/mio.py", line 207, in loadmat
MR, file_opened = mat_reader_factory(file_name, appendmat, **kwargs)
File "/home/user1/.local/lib/python3.6/site-packages/scipy/io/matlab/mio.py", line 63, in mat_reader_factory
mjv, mnv = get_matfile_version(byte_stream)
File "/home/user1/.local/lib/python3.6/site-packages/scipy/io/matlab/miobase.py", line 241, in get_matfile_version
raise ValueError('Unknown mat file type, version %s, %s' % ret)
ValueError: Unknown mat file type, version 0, 0
还有一种报错:
Traceback (most recent call last):
File "
File "/data/user1/pkgs/conda/envs/drc/lib/python3.7/site-packages/scipy/io/matlab/mio.py", line 217, in loadmat
MR, _ = mat_reader_factory(f, **kwargs)
File "/data/user1/pkgs/conda/envs/drc/lib/python3.7/site-packages/scipy/io/matlab/mio.py", line 72, in mat_reader_factory
mjv, mnv = get_matfile_version(byte_stream)
File "/data/user1/pkgs/conda/envs/drc/lib/python3.7/site-packages/scipy/io/matlab/miobase.py", line 235, in get_matfile_version
maj_ind = int(tst_str[2] == b'I'[0])
IndexError: index out of range
还有第三种:
Traceback (most recent call last):
File "/home/user1/pjs/FAE/Eval/npy_2_mat.py", line 148, in
read_mat(mat_file, 'gender')
File "/home/user1/pjs/FAE/Eval/npy_2_mat.py", line 21, in read_mat
matr = scipy.io.loadmat(mat_file)
File "/usr/local/lib/python3.5/dist-packages/scipy/io/matlab/mio.py", line 141, in loadmat
MR, file_opened = mat_reader_factory(file_name, appendmat, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/scipy/io/matlab/mio.py", line 71, in mat_reader_factory
raise NotImplementedError('Please use HDF reader for matlab v7.3 files')
NotImplementedError: Please use HDF reader for matlab v7.3 files
解决:换用h5py打开。
matr = h5py.File(mat_file, 'w')
x = h5py.File(mat_file, 'w')
data = x['data']
但是这种方式也有可能报错:
Traceback (most recent call last):
File "/home/user1/test.py", line 90, in
show_mat_flow(mat)
File "/home/user1/test.py", line 60, in show_mat_flow
data = x['data']
File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
File "/home/user1/.local/lib/python3.6/site-packages/h5py/_hl/group.py", line 264, in __getitem__
oid = h5o.open(self.id, self._e(name), lapl=self._lapl)
File "h5py/_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
File "h5py/_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
File "h5py/h5o.pyx", line 190, in h5py.h5o.open
KeyError: "Unable to open object (object 'data' doesn't exist)"
有问题的mat用h5py打开要么会报错, 要么读出来的keys是空的。即使用matlab去读取该文件,也可能还是报错:
原因:
[20/05/08]更新:这个报错很诡异。有时候交叉使用两种方法,或者换一个没有问题的mat文件,打开没有问题的mat文件之后再去打开之前有问题的。可能就解决了。
暂时不是很确定原因。可能是mat文件保存时出了问题。建议numpy数组保存为mat文件时应使用 scipy.io.savemat,打开时应使用io.loadmat。这样一般不会出错。不建议和h5py.File交叉使用。
解决(仅供参考):
保存mat文件之后用io.loadmat去检查是否保存正确。
重新运行生成mat文件的程序。以上报错的文件在matlab中打开时也会报错。
注:
with h5py.File(mfile, 'r') as mf:
mfkeys = mf.keys()
print('Keys:', mfkeys, 'in mat file:', mfile)
np_name = mf['name']
print('name shape:', np_name.shape, np_name.dtype)
for i in range(np_name.shape[1]):
name = ''.join([chr(v[0]) for v in mf[(np_name[0][i])]])
print(i, name)
参考:https://www.jianshu.com/p/aafdec57f6cf