ValueError: Unknown mat file type, version 0, 0, KeyError: Unable to open object (object data doe

根本原因可能是 【文件被你之前的读取或者其他操作损坏了】。文件已发生改变,和之前不一样。从而读不出来。在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 "", line 1, in
  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去读取该文件,也可能还是报错:

ValueError: Unknown mat file type, version 0, 0, KeyError: Unable to open object (object data doe_第1张图片

 


 

原因: 

[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

 

你可能感兴趣的:(Python,报错,#,可视化)