Я не имею практически никакого знания Matlab и должен перевести некоторые стандартные программы парсинга в Python. Они для больших файлов, которые самостоятельно разделены на 'блоки', и я имею право трудности от прочь с контрольной суммой наверху файла.
Что точно продолжается здесь в Matlab?
status = fseek(fid, 0, 'cof');
fposition = ftell(fid);
disp(' ');
disp(['** Block ',num2str(iBlock),' File Position = ',int2str(fposition)]);
% ----------------- Block Start ------------------ %
[A, count] = fread(fid, 3, 'uint32');
if(count == 3)
magic_l = A(1);
magic_h = A(2);
block_length = A(3);
else
if(fposition == file_length)
disp(['** End of file OK']);
else
disp(['** Cannot read block start magic ! Note File Length = ',num2str(file_length)]);
end
ok = 0;
break;
end
клин является файлом, в настоящее время посмотревшим iBlock, счетчик, для которого 'блока' Вы находитесь в в файле
magic_l и magic_h относятся к контрольным суммам позже, вот код для того (следует прямо из кода выше):
disp(sprintf(' Magic_L = %08X, Magic_H = %08X, Length = %i', magic_l, magic_h, block_length));
correct_magic_l = hex2dec('4D445254');
correct_magic_h = hex2dec('43494741');
if(magic_l ~= correct_magic_l | magic_h ~= correct_magic_h)
disp(['** Bad block start magic !']);
ok = 0;
return;
end
remaining_length = block_length - 3*4 - 3*4; % We read Block Header, and we expect a footer
disp(sprintf(' Remaining Block bytes = %i', remaining_length));
%08X
и hex2dec
материал? 3*4
вместо 12
?Действительно, хотя, я хочу знать, как копировать [A, count] = fread(fid, 3, 'uint32');
в Python, как io.readline()
просто вытягивает первые 3 символа файла. Извинения, если я упускаю суть где-нибудь здесь. Это - просто то использование io.readline(3)
на файле, кажется, возвращает что-то, что он не был должен, и я не понимаю как block_length
может поместиться в единственный байт, когда это могло потенциально быть очень длинно.
Спасибо за чтение этой прогулки. Я надеюсь, что можно понять отчасти, что я хочу знать! (Любое понимание вообще ценится.)
Из Документация FREAD
это функция для чтения двоичных данных. Второй аргумент указывает размер вывода вектор, третий размер / тип элементов чтения.
Для того, чтобы воссоздать это в Python, вы можете использовать модуль Module
:
f = open(...)
import array
a = array.array("L") # L is the typecode for uint32
a.fromfile(f, 3)
это будет прочитать читать три значения UINT32 из файла f
, которые доступны в А
потом. Из документации отFile
:
Читайте n элементов (в качестве значений машины) из файла объекта f и добавьте их к концу массива. Если доступны меньше, чем n элементов, EOFERROR повышен, но имеющиеся предметы, все еще вставляются в массив. f должен быть настоящий встроенный файловый объект; что-то еще с методом чтения () не будет делать.
Массивы реализуют протокол последовательности и, следовательно, поддерживают те же операции, что и списки, но вы также можете использовать метод .Tolist ()
, чтобы создать нормальный список из массива.
На самом деле, я хочу знать, как воспроизвести
[A, count] = fread (fid, 3, 'uint32');
В Matlab одна из сигнатур fread ()
- это fread (fileID, sizeA, precision)
. Это считывает первые элементы sizeA
(не байты) файла, каждый из которых имеет размер, достаточный для точности
. В этом случае, поскольку вы читаете uint32
, каждый элемент имеет размер 32 бита или 4 байта.
Вместо этого попробуйте io.readline (12)
, чтобы получить первые 3 4-байтовых элемента из файла.
Первая часть покрыта ответом Торстена ... вам понадобится массив
или nummeray
, чтобы все могли сделать что-либо с этими данными.
Что касается материалов% 08x и Hex2Dec,% 08x - это просто формат печати для этих номеров Unit32 (8-значный шестнадцатеричный, точно такой же, как Python), а Hex2Dec ('4d445254') - MATLAB для 0x4D445254.
Наконец, ~ = в Matlab - это побитовое сравнение; использовать == в Python.