복붙노트

[PYTHON] 파이썬에서 Matlab의 'fread'에 해당하는 것은 무엇입니까?

PYTHON

파이썬에서 Matlab의 'fread'에 해당하는 것은 무엇입니까?

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

fid는 현재보고있는 파일입니다. 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));

정말로, 나는 복제하는 법을 알고 싶다. [A, count] = fread (fid, 3, 'uint32'); 파이썬에서는 io.readline ()이 파일의 처음 3 문자를 가져 오는 중이다. 내가 여기서 어딘가에 요점을 놓치면 사과드립니다. 파일에서 io.readline (3)을 사용하면 안되는 것을 반환하는 것으로 보이고, 잠재적으로 매우 길어질 수있는 block_length가 어떻게 단일 바이트에 들어갈 수 있는지 이해하지 못합니다.

이 산책을 읽어 주셔서 감사합니다. 내가 알고 싶은 것을 이해할 수 있기를 바랍니다. (모든 통찰력은 인정됩니다.)

해결법

  1. ==============================

    1.fread의 문서에서 이진 데이터를 읽는 함수입니다. 두 번째 인수는 출력 벡터의 크기를 지정하고 세 번째 인수는 읽은 항목의 크기 / 유형을 지정합니다.

    fread의 문서에서 이진 데이터를 읽는 함수입니다. 두 번째 인수는 출력 벡터의 크기를 지정하고 세 번째 인수는 읽은 항목의 크기 / 유형을 지정합니다.

    이것을 파이썬에서 다시 만들려면 배열 모듈을 사용할 수 있습니다 :

    f = open(...)
    import array
    a = array.array("L")  # L is the typecode for uint32
    a.fromfile(f, 3)
    

    그러면 f 파일에서 3 개의 uint32 값을 읽습니다.이 값은 나중에 사용할 수 있습니다. fromfile의 문서에서 :

    배열은 시퀀스 프로토콜을 구현하므로 목록과 동일한 작업을 지원하지만 .tolist () 메서드를 사용하여 배열에서 일반 목록을 만들 수도 있습니다.

  2. ==============================

    2.Matlab을 Python으로 대체 할 때, 바이너리 데이터를 numpy.array로 읽으려고 했으므로 numpy.fromfile을 사용하여 데이터를 1 차원 배열로 읽습니다.

    Matlab을 Python으로 대체 할 때, 바이너리 데이터를 numpy.array로 읽으려고 했으므로 numpy.fromfile을 사용하여 데이터를 1 차원 배열로 읽습니다.

    import numpy as np
    
    with open(inputfilename, 'rb') as fid:
        data_array = np.fromfile(fid, np.int16)
    

    numpy.fromfile과 다른 Python 솔루션을 비교하면 다음과 같은 이점이 있습니다.

    Matlab fread는 열 벡터로 읽는 대신 데이터를 [m, n] 형식의 행렬로 읽는 기능이 있습니다. 예를 들어, 2 행의 행렬로 데이터를 읽으려면 다음을 사용하십시오.

    fid = fopen(inputfilename, 'r');
    data_array = fread(fid, [2, inf], 'int16');
    fclose(fid);
    

    Numpy의 모양과 조 변경을 사용하여 Python에서이 시나리오를 처리 할 수 ​​있습니다.

    import numpy as np
    
    with open(inputfilename, 'rb') as fid:
        data_array = np.fromfile(fid, np.int16).reshape((-1, 2)).T
    
  3. ==============================

    3.Matlab에서 fread ()의 시그니처 중 하나는 fread (fileID, sizeA, precision)입니다. 이것은 파일의 첫 번째 sizeA 요소 (바이트가 아님)를 읽습니다. 각 요소는 정밀도에 충분한 크기입니다. 이 경우 uint32를 읽으므로 각 요소의 크기는 32 비트 또는 4 바이트입니다.

    Matlab에서 fread ()의 시그니처 중 하나는 fread (fileID, sizeA, precision)입니다. 이것은 파일의 첫 번째 sizeA 요소 (바이트가 아님)를 읽습니다. 각 요소는 정밀도에 충분한 크기입니다. 이 경우 uint32를 읽으므로 각 요소의 크기는 32 비트 또는 4 바이트입니다.

    대신에 io.readline (12)을 사용하여 파일에서 처음 3 개의 4 바이트 요소를 가져 오십시오.

  4. ==============================

    4.첫 번째 부분은 Torsten의 대답으로 덮여 있습니다. 어쨌든 배열이나 numarray를 사용하여이 데이터를 처리해야합니다.

    첫 번째 부분은 Torsten의 대답으로 덮여 있습니다. 어쨌든 배열이나 numarray를 사용하여이 데이터를 처리해야합니다.

    % 08X와 hex2dec의 경우, % 08X는 unit32 숫자 (8 자리 16 진수, 정확히 파이썬과 동일)의 인쇄 형식이며 0x4D445254의 경우 hex2dec ( '4D445254')는 matlab입니다.

    마지막으로, ~ = matlab에 비트 비교입니다; 파이썬에서는 ==를 사용합니다.

  5. from https://stackoverflow.com/questions/2146031/what-is-the-equivalent-of-fread-from-matlab-in-python by cc-by-sa and MIT license