Я переписываю скрипт из matlab, который читает файл с 32-битными целыми двоичными кодами и анализирует их соответствующим образом. Я написал следующий метод, который предназначен для имитации функции от Matlab Fread():Чтение файла доходит до конца файла
def readi(f,n):
x = zeros(n,int);
for i in range(0,n):
x[i] = struct.unpack('i',f.read(4))[0];
print x[i];
return x;
Я называю эту функцию по-разному с п от 1 до 9 в моем сценарии я разобрать данные. Моя проблема заключается в том, что сценарий получает только часть пути в файл, прежде чем я получаю эту ошибку:
x[i] = struct.unpack('i',f.read(4))[0];
struct.error: unpack requires a string argument of length 4
Вероятно, питон думает, что достиг конца файла. Точка, в которой происходит ошибка, представляет собой строку в цикле, которая уже была повторена несколько раз. Кроме того, небольшая часть файла, который был разобран, уже соответствует точно тому, что мой скрипт matlab создает из того же самого файла (а не копии). Однако Matlab способен читать гораздо больший набор данных из файла. Кто-нибудь есть идеи о том, почему эта ошибка происходит?
Покажите нам код, в котором вы открываете файл. Открывается ли он в текстовом режиме, а не в двоичном режиме? – agf
Одна вопиющая ошибка здесь заключается в том, что вы не определяете endianess входного значения. Другое дело, что модуль struct расскажет вам, сколько байтов вам нужно, используйте эту информацию, чтобы избежать ошибок. –
Вы можете проверить работоспособность, поймав struct.error и распечатав f.tell(). Если он печатает размер вашего файла, вы знаете, что проблема не в этом фрагменте кода. – tdelaney