Каков эквивалент 'fread' от Matlab в Python?

Я не имею практически никакого знания 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 может поместиться в единственный байт, когда это могло потенциально быть очень длинно.

Спасибо за чтение этой прогулки. Я надеюсь, что можно понять отчасти, что я хочу знать! (Любое понимание вообще ценится.)

12
задан Matthew Rankin 8 February 2013 в 14:15
поделиться

3 ответа

Из Документация 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 () , чтобы создать нормальный список из массива.

8
ответ дан 2 December 2019 в 06:26
поделиться

На самом деле, я хочу знать, как воспроизвести [A, count] = fread (fid, 3, 'uint32');

В Matlab одна из сигнатур fread () - это fread (fileID, sizeA, precision) . Это считывает первые элементы sizeA (не байты) файла, каждый из которых имеет размер, достаточный для точности . В этом случае, поскольку вы читаете uint32 , каждый элемент имеет размер 32 бита или 4 байта.

Вместо этого попробуйте io.readline (12) , чтобы получить первые 3 4-байтовых элемента из файла.

2
ответ дан 2 December 2019 в 06:26
поделиться

Первая часть покрыта ответом Торстена ... вам понадобится массив или nummeray , чтобы все могли сделать что-либо с этими данными.

Что касается материалов% 08x и Hex2Dec,% 08x - это просто формат печати для этих номеров Unit32 (8-значный шестнадцатеричный, точно такой же, как Python), а Hex2Dec ('4d445254') - MATLAB для 0x4D445254.

Наконец, ~ = в Matlab - это побитовое сравнение; использовать == в Python.

0
ответ дан 2 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: