Невозможно прочитать файл MAT с помощью scipy

Я пытаюсь прочитать файл Matlab, используя scipy

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 файла, сохраненных таким же образом..

Я могу открыть часть_000, но не часть_001.... почему? :(


person gabboshow    schedule 05.03.2017    source источник
comment
Какую версию формата файла Matlab вы используете? Попробуйте другой, более ранний.   -  person hpaulj    schedule 05.03.2017
comment
это обычный файл мата, сохраненный с помощью команды matlab: save (имя файла)   -  person gabboshow    schedule 05.03.2017
comment
среди 550 я не могу открыть только один файл.... они были сохранены вместе в цикле foor   -  person gabboshow    schedule 05.03.2017
comment
Так это работает для многих файлов, только не для этого? Трудно помочь без доступа к проблемному файлу.   -  person hpaulj    schedule 05.03.2017
comment
данные можно загрузить отсюда: drive.google.com/drive/folders/   -  person gabboshow    schedule 05.03.2017
comment
Я могу загрузить part000 без проблем, для part001 я получаю сообщение об ошибке   -  person gabboshow    schedule 05.03.2017


Ответы (4)


Проблема, кажется, вызвана компрессией. .mat файлы автоматически сжимаются, начиная с версии 7.

Поэтому предлагаю попробовать сохранить файл в более ранней, несжатой версии .mat файла 6:

save(filename, 'data', '-v6');
person Richard    schedule 05.03.2017
comment
Это просто спасло меня - отличное предложение - person BMichell; 15.10.2018
comment
Я получаю то же сообщение об ошибке, что и OP, из матового файла, который я загрузил, а затем сохранил с параметром -v6, и который при проверке его первых байтов утверждает, что он находится в формате MATLAB 5.0, то есть в матовом файле версии 6. - person sthelen; 13.12.2019

Проблема заключается в аргументе ключевого слова verify_compressed_data_integrity scipy.io.loadmat, который по умолчанию равен True. Он пытается выполнить некоторую проверку заголовков на наличие ошибок, но может вызвать ошибку, даже если данные извлечены нормально. См. эту связанную с GitHub проблему. Я не уверен в последствиях отключения этого на постоянной основе, но если вы используете следующее, это должно решить вашу проблему тем временем (я не могу проверить это на ваших данных, оно больше не доступно по указанному URL-адресу) .

import scipy.io as sio

data = sio.loadmat(filepath, verify_compressed_data_integrity=False)
person billyjmc    schedule 04.12.2018

Я могу загрузить оба файла с 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 имеет размер 13 МБ, и его также можно загрузить.

>> save -v6 part_0003.mat -struct data1

Так что должен быть какой-то сбой в loadmat's обработке формата V7.

person hpaulj    schedule 05.03.2017

иногда файлы матов повреждаются, поэтому Matlab не может распознать тип данных и не может его загрузить. поэтому при сохранении файла мат. попробуйте сохранить файл мата, установив long_field_names=True

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

person Khan    schedule 27.11.2018