Appia의 IT세상

파이썬[Python] 054 바이너리(binary) 읽기(frombuffer), 쓰기(tobytes) - Numpy007 본문

Python/Python Numpy

파이썬[Python] 054 바이너리(binary) 읽기(frombuffer), 쓰기(tobytes) - Numpy007

Appia 2020. 3. 2. 08:25
반응형

이번 포스팅은 바이너리를 일고 쓰는 방법들에 대해서 이야기를 드리고자 합니다. 물론 numpy가 아니여도 관련해서 바이너리를 읽고 쓸수 있지만, 이번에는 numpy를 이용하도록 하겠습니다. (pack/unpack을 이용한 부분에서는 향후 관련하여 포스팅 예정입니다.) 

 

바이너리(Binary) 읽기 

(numpy기준) 바이너리를 파일을 읽어오는 가장 쉬운 방법은 numpy.frombuffer를 활용하는 것입니다. 버퍼에 있는 데이터를 1차원 배열로 만들어 주는 기능을 하는데, 다음과 같이 바이너리를 특정 변수에 넣어 두고 다음과 같이 바이너리를 읽는 데 매우 많이 사용됩니다. 

 

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)

 

buffer - 데이터 입니다. 물론 꼭 바이너리가 아니여도 되지만, 여기에서는 바이너리 값이라고 생각하시면 됩니다. 

dtype - 데이터 타입입니다. 기본 값은 float입니다. 

count - 읽어올 데이터의 수입니다. 기본 값은 -1로 전체 값을 읽어 옵니다. 

offset - 바이너리 값을 읽어올 시작 위치입니다. 기본 값 0 

 

그럼 다음 예제를 살펴보도록 하겠습니다. 

1
2
3
4
import numpy
data = b'\xd8\x0fI@ff\xe6\x01\x00\x00\x00@'
ArrBin=numpy.frombuffer(data, dtype=numpy.float32)
print(ArrBin)
cs

 

위의 부분을 실행하면 다음과 같은 결과가 나옵니다. 

1
[3.141592e+00 8.463559e-38 2.000000e+00]
cs

위와 같이 frombuffer를 이용하여 바이너리 데이터를 읽어와서 배열을 만들 수 있었습니다. 

 

바이너리(Binary) 쓰기 

numpy 배열에서 byte형태 바이너리 형태로 변환시켜주는 함수를 제공합니다. 그 함수는 바로 tobytes()함수입니다. 

 

tobytes(order) 

 

order - 다차원 배열일 경우 열과 행중 어떤 부분을 먼저 진행할 것인지에 대한 순서입니다. C - Row중심, F - Column 중

심 

다음 예시를 살펴보겠습니다. 

1
2
3
4
5
import numpy
data = b'\xd8\x0fI@ff\xe6\x01\x00\x00\x00@'
ArrBin=numpy.frombuffer(data, dtype=numpy.float32)
print(ArrBin)
print(ArrBin.tobytes())
cs

 

위의 예제에 마지막 줄을 추가해봤습니다. 그럼 다음과 같은 결과가 나옵니다. 

1
2
[3.141592e+00 8.463559e-38 2.000000e+00]
b'\xd8\x0fI@ff\xe6\x01\x00\x00\x00@'
cs

바이너리 형태로 값을 출력해줍니다. 

 

오늘은 바이너리 값을 읽어와서 배열을 만들고, 배열에서 바이너리를 만드는 방법에 대해서 살펴봤습니다. 실제 원래 데이터 그대로를 사용하면 되는데 왜 이렇게 한번 꼬아서 하는 걸까라는 생각을 하실 수 있습니다. 다, 저장공간의 제약 및 데이터 처리의 속도 때문이라고 합니다. 전, 실제 동의 하지 않습니다만.. 여튼 궁금하시거나 문의 사항 있으시면 언제든지 문의 및 방명록 글 부탁드립니다. 

반응형
Comments