Python에서 바이너리 파일 읽기

Manav Narula 2023년1월30일
  1. 파이썬에서open()함수를 사용하여 바이너리 파일 읽기
  2. Python에서pathlib.Path를 사용하여 바이너리 파일 읽기
  3. Python에서numpy.fromfile()함수로 바이너리 파일 읽기
Python에서 바이너리 파일 읽기

프로그램 또는 내부 프로세서가 이진 파일을 해석합니다. 내용으로 바이트를 포함합니다. 바이너리 파일을 읽을 때bytes 유형의 객체가 반환됩니다.

파이썬에서open()함수를 사용하여 바이너리 파일 읽기

파이썬에서는open()함수를 사용하여 함수에 경로를 전달하고 기본적으로 읽기 모드 인 특정 모드에서 파일을 열어 파일 객체를 생성합니다. 바이너리 파일을 열 때, 읽기, 쓰기, 추가 모드에서 파일을 열 때b 매개 변수를 지정해야합니다. 이 튜토리얼에서는 바이너리 읽기 모드 인rb를 다룰 것입니다.

아래 코드에서 바이너리 파일을 읽고 파일에서 문자를 인쇄합니다.

with open("sample.bin", "rb") as f:
    data = f.read()

print(data[2])

출력:

83

개별 문자를 인쇄하면 정수를 볼 수 있습니다.

파이썬에는struct라는 패키지가 있는데,이 패키지는 많은 메소드를 가지고 있으며 파일, 데이터베이스 및 기타 리소스에 저장된 바이너리 데이터를 처리하는 데 사용할 수 있습니다.

struct.unpack()은 지정된 형식 레이아웃에서 압축 된 데이터를 읽는 데 사용됩니다. 데이터를 압축 및 압축 해제하는 동안 사용되는 이러한 레이아웃은 형식 문자를 사용하여 지정됩니다. 이러한 형식 문자는 크기와 함께 아래에 표시됩니다.

구조체 풀기 형식 문자 table

struct.unpack()함수는 항상 튜플을 반환합니다.

import struct

with open("sample.bin", "rb") as f:
    data = f.read()

unpack_result = struct.unpack("hhl", data[0:8])
print(unpack_result)

출력:

(1280, 27731, 7037801)

여기서hhl은 출력에서 ​​볼 수 있듯이 데이터 형식 레이아웃으로 short, short 및 long int를 나타냅니다. 이것이 포맷 레이아웃의 크기가 8 (2 + 2 + 4)이기 때문에 언 패킹 버퍼가 8 바이트에 불과한 이유입니다.

Python에서pathlib.Path를 사용하여 바이너리 파일 읽기

또한pathlib 라이브러리의Path 클래스에서read_bytes()메서드를 사용하여 바이트 모드로 파일을 읽은 다음 이전에 표시된대로struct.unpack()함수를 사용하여 데이터를 해석 할 수 있습니다.

from pathlib import Path
import struct

data = Path("sample.bin").read_bytes()

multiple = struct.unpack("ii", data[:8])

print(multiple)

출력:

(1817380096, 7037801)

Python에서numpy.fromfile()함수로 바이너리 파일 읽기

또 다른 흥미로운 접근 방식은NumPy 모듈에서 제공됩니다. 이 모듈의fromfile()함수를 사용하면dtype()함수를 사용하여 포맷 데이터를 지정한 후 파일에서 바이너리 데이터를 읽을 수 있습니다. 이것은 빠른 방법으로 간주됩니다. 다음 코드는이를 구현하는 방법을 보여줍니다.

import numpy as np

with open("sample.bin") as f:
    rectype = np.dtype(np.int32)
    bdata = np.fromfile(f, dtype=rectype)

print(bdata)

출력:

[1817380096    7037801]

여기서는 포맷 유형을 정수 -32 비트로 지정하고fromfile()함수를 사용하여 데이터를 추출합니다.

작가: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

관련 문장 - Python File