HOWTO · Python
Matlab-mat-Dateien in Python lesen
Dieses Tutorial zeigt, wie Matlab-Mat-Dateien in Python gelesen und geöffnet werden
Auf dieser Seite
MATLAB speichert Arbeitsbereichsvariablen in .mat-Dateien, und Python kann sie nicht von Haus aus öffnen – welche Bibliothek zum Lesen geeignet ist, hängt von der MAT-Dateiversion ab. Diese Anleitung zeigt, wie Sie das Format einer Datei erkennen und ihre Variablen mit scipy.io, h5py, mat4py oder der matlab.engine-API laden, und sie erklärt, wo jeder Ansatz an seine Grenzen stößt.
Die richtige Bibliothek für die MAT-Dateiversion wählen
MATLAB hat zwei Datei-Layouts verwendet. Die MAT-Dateiversionen 5 bis 7.2 nutzen das eigene Binärformat von MATLAB und beginnen mit einem 128-Byte-Text-Header, der mit MATLAB anfängt; die noch älteren MATLAB-4-Dateien verwenden dasselbe klassische Layout, besitzen aber keinen beschreibenden Header – sie beginnen direkt mit Datenelementen. scipy.io.loadmat liest die gesamte klassische Familie, mit oder ohne Header. Dateien, die mit -v7.3 gespeichert wurden, sind HDF5-Dateien: Sie behalten einen kleinen MATLAB-Benutzerblock, speichern die Daten aber als HDF5-Datasets, und genau diese öffnet h5py. NumPy allein kann keines der beiden Layouts öffnen – es wandelt lediglich ein bereits geladenes Dataset in ein Array um.
Sie können eine Datei identifizieren, ohne etwas zu installieren, indem Sie ihre ersten Bytes ansehen. Führen Sie dieses Beispiel aus, das je eine Datei jeder gängigen Art in einen temporären Ordner schreibt und sie anhand des Headers klassifiziert. Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch:
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
Eine echte 7.3-Datei erwähnt HDF5 in ihrem Header-Text und trägt die HDF5-Signatur nach dem Benutzerblock, während der Header einer Datei der Version 5–7.2 einfach mit MATLAB beginnt. Die Prüfung klassifiziert nur anhand dieser beiden Merkmale: Eine MATLAB-4-Datei zeigt keines davon und landet daher auf der Fallback-Meldung – scipy.io.loadmat öffnet sie aber trotzdem. Betrachten Sie dieses Ergebnis daher als Hinweis, loadmat direkt auszuprobieren, und nicht als Beweis, dass die Datei unlesbar ist. Als Faustregel gilt: Greifen Sie zuerst zu scipy.io.loadmat, wenn die Datei Version 7.2 oder älter ist, verwenden Sie h5py für 7.3-Dateien, wählen Sie mat4py, wenn Sie aus einer klassischen Datei einfache Python-Listen statt NumPy-Arrays wünschen, und nutzen Sie matlab.engine nur, wenn MATLAB selbst installiert ist und Sie vollständige Treue für komplexe Typen benötigen. Sobald die Variablen in Python vorliegen, kann pandas sie nach CSV oder Excel exportieren, und scipy.io.savemat oder ein HDF5-Dataset kann bei Bedarf später wieder eine .mat-Datei schreiben.
Die folgenden Abschnitte verwenden sample.mat (eine klassische Datei) und sample_v73.mat (eine 7.3-Datei), von denen angenommen wird, dass sie eine Variable namens measurements enthalten. Diese Snippets sind abhängigkeitsspezifisch: Sie setzen voraus, dass das genannte Paket installiert ist – führen Sie sie daher in Ihrer eigenen Umgebung aus und nicht in einem nackten Interpreter.
MATLAB-Dateien mit SciPy lesen
Installieren Sie die Bibliothek mit pip install scipy und rufen Sie anschließend scipy.io.loadmat("sample.mat") auf. Der Aufruf gibt ein Dictionary zurück: Neben Ihren Variablen enthält es die Metadaten-Schlüssel __header__, __version__ und __globals__, und jede MATLAB-Variable wird unter ihrem Arbeitsbereichsnamen zu einem NumPy-Array, sodass data["measurements"] diese Variable direkt abruft.
Zwei Optionen sind nützlich, wenn die Dimensionen nicht wie erwartet aussehen. Wenn Sie squeeze_me=True an loadmat übergeben, werden die Singleton-Dimensionen von MATLAB eingezogen, sodass ein Skalar als Skalar zurückkommt; in Kombination mit struct_as_record=False erreichen Sie Struct-Felder als Attribute statt als verschachtelte Array-Elemente. Um Ergebnisse zurückzuschreiben, erzeugt scipy.io.savemat("out.mat", {"measurements": data["measurements"]}) eine klassische MAT-Datei.
Die Versionsgrenze ist die wichtige Einschränkung: loadmat unterstützt MAT-Dateiformate nur bis einschließlich 7.2. Bei einer 7.3-Datei meldet es das Format als nicht unterstützt, weil die Nutzdaten HDF5 sind – diese Datei braucht den Ansatz aus dem nächsten Abschnitt. Wenn Sie die MATLAB-Seite kontrollieren, erzeugt das Speichern mit save data.mat -v7 eine Datei, die loadmat akzeptiert.
MATLAB-7.3-Dateien mit h5py lesen
Eine -v7.3-Datei ist HDF5 mit einem MATLAB-Benutzerblock, daher genügt pip install h5py, um sie zu öffnen. h5py.File("sample_v73.mat", "r") öffnet die Datei zum Lesen, und list(f.keys()) zeigt die Gruppen der obersten Ebene – eine pro MATLAB-Variable plus eine #refs#-Gruppe, die gemeinsam genutzte Cell- und Struct-Inhalte speichert.
Das Lesen von f["measurements"][()] materialisiert das Dataset als NumPy-Array; NumPy wandelt die Daten hier lediglich um, da h5py die Datei geöffnet hat. Zwei Layout-Details sind in der Praxis wichtig. MATLAB schreibt Arrays spaltenorientiert, sodass ein 2-D-Dataset häufig transponiert zurückkommt, und f["measurements"][()].T stellt die MATLAB-Ausrichtung wieder her. Cell-Arrays und Structs kommen als HDF5-Objektreferenzen in #refs# an, sodass Sie jeden Eintrag mit f[ref] dereferenzieren müssen, statt ihn direkt zu lesen.
MATLAB-Dateien mit mat4py lesen
pip install mat4py liefert Ihnen eine kleinere API für klassische MAT-Dateien. Nach from mat4py import loadmat gibt der Aufruf loadmat("sample.mat") ein gewöhnliches Dictionary zurück, in dem numerische Arrays verschachtelte Python-Listen sind und Structs zu verschachtelten Dictionaries werden – praktisch, wenn Sie die Daten als reine Python-Typen ohne NumPy als Abhängigkeit wünschen.
Behandeln Sie mat4py als Reader für die klassischen Formate: Es öffnet keine 7.3-HDF5-Dateien, und tief verschachtelte oder ungewöhnliche MATLAB-Strukturen lassen sich eventuell nicht sauber abbilden – es ist daher kein Ersatz für jede MAT-Datei. Prüfen Sie die Konvertierung einer komplexen Datei gegen scipy.io, bevor Sie darauf aufbauen.
MATLAB-Dateien mit der MATLAB-Engine-API lesen
Wenn MATLAB selbst installiert ist, ist seine Engine-API für Python die Option mit der höchsten Treue. Die Installation von matlabengine mit pip (oder das Ausführen des mit MATLAB gelieferten Installers) stellt matlab.engine bereit, das im Hintergrund eine echte MATLAB-Sitzung steuert. eng = matlab.engine.start_matlab() startet diese Sitzung, eng.load("sample.mat") lädt jede Variable unabhängig von der Dateiversion in den Engine-Arbeitsbereich, und eng.quit() beendet sie, wenn Sie fertig sind. Werte kommen als MATLAB-Typen wie matlab.double zurück, die NumPy mit np.asarray umwandelt.
Die Nachteile sind praktischer, nicht formatbezogener Natur: Die Engine benötigt eine lizenzierte MATLAB-Installation und eine passende Engine-Version, der Sitzungsstart dauert Sekunden, und sie läuft nicht in einer reinen Python-Umgebung. Das ist auch der Grund, warum dieser Abschnitt die Aufrufe inline statt als eigenständiges Beispiel zeigt – die anderen Bibliotheken sind die richtige Standardwahl, solange MATLAB nicht bereits auf dem Rechner ist.