HOWTO · Python
Python에서 Matlab mat 파일 읽기
이 튜토리얼은 Python에서 Matlab 매트 파일을 읽고 여는 방법을 보여줍니다.
이 페이지의 내용
MATLAB은 작업 공간 변수를 .mat 파일에 저장하지만 Python에는 이를 여는 내장 기능이 없으므로 MAT 파일 버전에 맞는 리더 라이브러리를 선택해야 합니다. 이 가이드에서는 파일 형식을 식별하고 scipy.io, h5py, mat4py 또는 matlab.engine API로 변수를 불러오는 방법을 보여주고 각 방식이 어디까지 지원되는지도 설명합니다.
MAT 파일 버전에 맞는 리더 선택하기
MATLAB은 두 가지 파일 레이아웃을 사용해 왔습니다. MAT 파일 버전 5부터 7.2까지는 MATLAB 고유의 바이너리 형식을 사용하며 MATLAB으로 시작하는 128바이트 텍스트 헤더로 시작합니다. 이보다 오래된 MATLAB 4 파일도 같은 클래식 레이아웃을 사용하지만 설명 헤더가 없어 데이터 요소에서 바로 시작됩니다. scipy.io.loadmat은 헤더 유무와 관계없이 클래식 계열 전체를 읽습니다. -v7.3으로 저장된 파일은 HDF5 파일입니다. 작은 MATLAB 사용자 블록은 유지하지만 데이터를 HDF5 데이터셋으로 저장하며 이 파일은 h5py가 엽니다. NumPy만으로는 두 레이아웃 모두 열 수 없고 이미 로드된 데이터셋을 배열로 변환할 뿐입니다.
아무것도 설치하지 않고도 파일의 첫 바이트를 확인해 형식을 식별할 수 있습니다. 다음 예제는 임시 폴더에 흔한 종류의 파일을 하나씩 생성한 뒤 헤더로 분류합니다:
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import os
import tempfile
folder = tempfile.mkdtemp()
classic = os.path.join(folder, "classic.mat")
modern = os.path.join(folder, "v73.mat")
with open(classic, "wb") as f:
f.write(b"MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Thu Oct 29 2026".ljust(128, b" "))
with open(modern, "wb") as f:
f.write(b"MATLAB 7.3 MAT-file, Platform: GLNXA64, HDF5 schema 1.00".ljust(512, b" "))
f.write(b"\x89HDF\r\n\x1a\n")
def mat_kind(path):
with open(path, "rb") as f:
head = f.read(128)
f.seek(512)
signature = f.read(8)
if b"HDF5" in head or signature.startswith(b"\x89HDF"):
return "MATLAB 7.3 (HDF5): read with h5py"
if head.startswith(b"MATLAB"):
return "MAT-file 7.2 or older: read with scipy.io.loadmat"
return "no v5+ header or HDF5 signature — possibly a MATLAB 4 file: try scipy.io.loadmat"
print(mat_kind(classic))
print(mat_kind(modern))
MAT-file 7.2 or older: read with scipy.io.loadmat
MATLAB 7.3 (HDF5): read with h5py
실제 7.3 파일은 헤더 텍스트에 HDF5을 언급하고 사용자 블록 뒤에 HDF5 시그니처를 포함하는 반면 버전 5–7.2 파일의 헤더는 단순히 MATLAB으로 시작합니다. 이 검사는 이 두 가지 마커로만 분류하므로 둘 다 나타내지 않는 MATLAB 4 파일은 폴백 메시지로 분류됩니다. 그러나 scipy.io.loadmat은 여전히 이 파일을 열 수 있으므로 그 결과를 파일을 읽을 수 없다는 증거가 아니라 loadmat을 직접 시도해 보라는 신호로 받아들이세요. 일반적인 기준으로 파일이 버전 7.2 이하이면 scipy.io.loadmat을 먼저 사용하고 7.3 파일에는 h5py를 사용하며 클래식 파일에서 NumPy 배열 대신 일반 Python 리스트를 원하면 mat4py를 선택하고 MATLAB 자체가 설치되어 있고 복잡한 타입을 충실하게 처리해야 할 때만 matlab.engine을 사용하세요. 변수가 Python으로 로드된 후에는 pandas로 CSV나 Excel로 내보낼 수 있고 나중에 필요하면 scipy.io.savemat 또는 HDF5 데이터셋으로 .mat 파일을 다시 쓸 수도 있습니다.
아래 섹션들은 measurements라는 변수가 들어 있다고 가정한 sample.mat(클래식 파일)과 sample_v73.mat(7.3 파일)을 사용합니다. 이 스니펫들은 의존성에 따라 달라서 이름 붙은 패키지가 설치되어 있다고 가정하므로 빈 인터프리터가 아니라 직접 준비한 환경에서 실행하세요.
SciPy로 MATLAB 파일 읽기
pip install scipy로 라이브러리를 설치한 다음 scipy.io.loadmat("sample.mat")를 호출하세요. 이 함수는 딕셔너리를 반환합니다. 사용자 변수와 함께 __header__, __version__, __globals__ 메타데이터 키가 들어 있고 모든 MATLAB 변수는 작업 공간 이름 아래 NumPy 배열이 되므로 data["measurements"]로 해당 변수를 바로 가져올 수 있습니다.
모양이 이상해 보일 때 알아두면 좋은 옵션이 두 가지 있습니다. loadmat에 squeeze_me=True를 전달하면 MATLAB의 싱글턴 차원이 제거되어 스칼라가 스칼라로 반환되고 struct_as_record=False와 함께 사용하면 중첩된 배열 요소 대신 속성으로 구조체 필드에 접근할 수 있습니다. 결과를 다시 쓰려면 scipy.io.savemat("out.mat", {"measurements": data["measurements"]})로 클래식 MAT 파일을 만들 수 있습니다.
버전 제한이 중요한 제약입니다. loadmat은 7.2까지의 MAT 파일 형식만 지원합니다. 7.3 파일을 전달하면 페이로드가 HDF5이므로 지원하지 않는 형식으로 보고되며 그 파일에는 다음 섹션의 방식이 필요합니다. MATLAB 쪽을 제어할 수 있다면 save data.mat -v7로 저장해 loadmat이 받아들이는 파일을 만들 수 있습니다.
h5py로 MATLAB 7.3 파일 읽기
-v7.3 파일은 MATLAB 사용자 블록이 있는 HDF5 파일이므로 pip install h5py만 설치하면 열 수 있습니다. h5py.File("sample_v73.mat", "r")은 파일을 읽기용으로 열고 list(f.keys())는 최상위 그룹을 보여줍니다. 각 MATLAB 변수마다 그룹이 하나씩 있고 공유된 셀과 구조체 내용을 저장하는 #refs# 그룹도 있습니다.
f["measurements"][()]를 읽으면 데이터셋이 NumPy 배열로 구체화됩니다. 파일은 h5py가 열었으므로 여기서 NumPy는 데이터를 변환할 뿐입니다. 실무에서는 두 가지 레이아웃 세부 사항이 중요합니다. MATLAB은 배열을 열 우선(column-major)으로 쓰므로 2차원 데이터셋은 흔히 전치되어 돌아오며 f["measurements"][()].T로 MATLAB 방향을 복원할 수 있습니다. 셀 배열과 구조체는 #refs# 안의 HDF5 객체 참조로 전달되므로 각 항목을 직접 읽지 말고 f[ref]로 역참조해야 합니다.
mat4py로 MATLAB 파일 읽기
pip install mat4py는 클래식 MAT 파일을 대상으로 하는 더 작은 API를 제공합니다. from mat4py import loadmat 후 loadmat("sample.mat")를 호출하면 숫자 배열은 중첩된 Python 리스트로 구조체는 중첩된 딕셔너리로 들어 있는 일반 딕셔너리를 반환합니다. NumPy를 가져오지 않고 데이터를 순수 Python 타입으로 다루고 싶을 때 편리합니다.
mat4py는 클래식 형식용 리더로 취급하세요. 7.3 HDF5 파일은 열지 못하고 깊게 중첩되거나 특이한 MATLAB 구조는 깔끔하게 매핑되지 않을 수 있으므로 모든 MAT 파일의 대체재는 아닙니다. 복잡한 파일은 이를 기반으로 작업하기 전에 scipy.io와 변환 결과를 비교해 확인하세요.
MATLAB Engine API로 MATLAB 파일 읽기
MATLAB 자체가 설치되어 있다면 Python용 Engine API가 가장 충실도 높은 선택지입니다. pip으로 matlabengine을 설치하거나 MATLAB에 포함된 설치 프로그램을 실행하면 matlab.engine이 노출되며 이는 백그라운드에서 실제 MATLAB 세션을 구동합니다. eng = matlab.engine.start_matlab()으로 세션을 시작하고 eng.load("sample.mat")은 파일 버전에 관계없이 모든 변수를 엔진 작업 공간으로 불러오며 작업이 끝나면 eng.quit()으로 세션을 닫습니다. 값은 matlab.double 같은 MATLAB 타입으로 반환되며 NumPy의 np.asarray로 변환할 수 있습니다.
장단점은 형식보다 실용적인 측면에 있습니다. 엔진에는 라이선스가 있는 MATLAB 설치와 일치하는 엔진 버전이 필요하고 세션 시작에 몇 초가 걸리며 순수 Python 환경에서는 실행할 수 없습니다. 이 때문에 이 섹션에서는 독립 실행 예제 대신 호출을 인라인으로 보여줍니다. MATLAB이 이미 설치되어 있지 않다면 다른 라이브러리들이 적절한 기본 선택입니다.