【问题标题】:Unable to read MAT file with scipy无法使用 scipy 读取 MAT 文件
【发布时间】:2017-07-25 05:44:50
【问题描述】:

我正在尝试使用 scipy 读取 matlab 文件

import scipy.io as sio

data = sio.loadmat(filepath)

但我得到了错误

ValueError: Did not fully consume compressed contents of an miCOMPRESSED element. This can indicate that the .mat file is corrupted.

在 Matlab 中我可以毫无问题地打开这个文件。我也尝试再次保存它,但没有任何改变...... 你能帮帮我吗?

这里:https://drive.google.com/drive/folders/0B3vXKJ_zYaCJanZfOUVIcGJyR0E 您可以找到以相同方式保存的2个文件..

我可以打开 part_000,但不能打开 part_001.... 为什么? :(

【问题讨论】:

  • 你使用的是什么matlab文件格式版本?尝试不同的、更早的。
  • 是一个普通的mat文件,使用matlab命令保存:save(filename)
  • 在 550 个文件中我不能只打开一个文件....它们被一起保存在一个循环中
  • 所以它适用于许多文件,只是不是这个?如果不访问问题文件,很难提供帮助。
  • 您可以从这里下载数据:drive.google.com/drive/folders/…

标签: python matlab scipy


【解决方案1】:

问题在于scipy.io.loadmatverify_compressed_data_integrity 关键字参数,默认为True。它试图对标头进行一些错误检查,但即使数据提取得很好,也会引发错误。见this related GitHub issue。我不确定全职关闭此功能的影响,但如果您使用以下内容,它应该同时解决您的问题(我无法根据您的数据检查它,它不再在提供的 URL 上可用) .

import scipy.io as sio

data = sio.loadmat(filepath, verify_compressed_data_integrity=False)

【讨论】:

    【解决方案2】:

    有时 mat 文件会损坏,因此 Matlab 无法识别数据类型并且无法加载它。所以在保存mat文件的同时。尝试通过设置 long_field_names=True 来保存 mat 文件

    scipy.io.savemat(filename,long_field_names=True)

    【讨论】:

      【解决方案3】:

      我可以用 Octave 加载这两个文件,然后重写导致问题的文件

      >> data1 = load('part_0001.mat');
      >> save -v7 part_0002.mat -struct data1
      

      在 Python 中,重写的文件可以正常加载,就像您的 0000.mat 文件一样。

      In [8]: data2=loadmat('part_0002.mat')
      In [10]: data2.keys()
      Out[10]: dict_keys(['RealTime', 'AccNorm', 'Alt', 'FsP', 'DeviceTime', 'FsA', 'Acc', 'imatemp', 'Time', '__version__', '__globals__', '__header__'])
      

      重写后的文件实际上要小一些。 V6 文件大小为 13M,也可加载。

      >> save -v6 part_0003.mat -struct data1
      

      所以loadmat's 处理 V7 格式时一定有一些小故障。

      【讨论】:

        【解决方案4】:

        问题似乎是由压缩引起的。 .mat 文件从版本 7 开始自动压缩。

        因此,我建议尝试将文件保存在较早的、未压缩的.mat 文件版本 6 中:

        save(filename, 'data', '-v6');
        

        【讨论】:

        • 这只是救了我 - 很棒的建议
        • 我从我加载然后用 -v6 保存的 mat 文件中收到与 OP 相同的错误消息,并且在检查它的第一个字节时,它声称是 MATLAB 5.0 格式,即版本 6 mat 文件。
        猜你喜欢
        • 2017-12-24
        • 1970-01-01
        • 2019-05-19
        • 2021-02-23
        • 2016-01-25
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 2015-12-19
        相关资源
        最近更新 更多