Quel est l'équivalent de 'fread' de Matlab en Python?

Je n'ai pratiquement aucune connaissance de Matlab, et de la nécessité de traduire certaines des routines d'analyse en Python. Ils sont pour les gros fichiers, qui sont eux-mêmes divisés en "blocs", et je vais avoir des difficultés à droite de la route, avec la somme de contrôle en haut du fichier.

Ce qui se passe exactement ici dans 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

fid est le fichier actuellement regardé
iBlock est un compteur pour qui "le bloc" vous êtes dans dans le fichier

magic_l et magic_h sont à faire avec les sommes de contrôle plus tard, voici le code qui (suit directement le code ci-dessus):

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));
  • Ce qui se passe avec le %08X et la hex2dec des trucs?
  • Aussi, pourquoi spécifier 3*4 au lieu de 12?

Vraiment bien, je veux savoir comment reproduire [A, count] = fread(fid, 3, 'uint32'); en Python, comme io.readline() est simplement de tirer les 3 premiers caractères du fichier. Toutes mes excuses si je manque le point quelque part ici. C'est juste que l'utilisation de io.readline(3) sur le fichier semble renvoyer quelque chose qu'il ne devrait pas, et je ne comprends pas comment les block_length peuvent tenir dans un seul octet quand il pourrait être très longue.

Merci pour la lecture de cette randonnée. J'espère que vous pouvez comprendre un peu ce que je veux savoir! (Aucune information du tout apprécié.)

source d'informationauteur Duncan Tait