HOWTO · Python

Lire les fichiers mat Matlab en Python

Ce tutoriel montre comment lire et ouvrir des fichiers mat Matlab en Python

Sur cette page

MATLAB enregistre les variables de l’espace de travail dans des fichiers .mat, et Python ne propose aucun moyen intégré de les ouvrir : vous choisissez une bibliothèque de lecture selon la version du fichier MAT. Ce guide montre comment identifier le format d’un fichier et charger ses variables avec scipy.io, h5py, mat4py ou l’API matlab.engine, et il explique où chaque approche cesse de fonctionner.

Choisir un lecteur selon la version du fichier MAT

MATLAB a utilisé deux structures de fichier. Les versions 5 à 7.2 des fichiers MAT utilisent le format binaire propre à MATLAB et commencent par un en-tête textuel de 128 octets qui débute par MATLAB ; les fichiers MATLAB 4, plus anciens encore, utilisent la même structure classique, mais n’ont pas d’en-tête descriptif — ils commencent directement par des éléments de données. scipy.io.loadmat lit toute la famille classique, avec ou sans en-tête. Les fichiers enregistrés avec -v7.3 sont des fichiers HDF5 : ils conservent un petit bloc utilisateur MATLAB, mais stockent les données sous forme de jeux de données HDF5, ce que h5py ouvre. NumPy seul ne peut ouvrir aucune de ces deux structures — il ne fait que convertir un jeu de données déjà chargé en tableau.

Vous pouvez identifier un fichier sans rien installer en examinant ses premiers octets. Exécutez cet exemple, qui écrit un fichier de chaque type courant dans un dossier temporaire et les classe selon leur en-tête. Il affiche le lecteur recommandé pour chaque fichier ; le code et les libellés affichés restent en anglais.

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

Un vrai fichier 7.3 mentionne HDF5 dans le texte de son en-tête et porte la signature HDF5 après le bloc utilisateur, tandis que l’en-tête d’un fichier de version 5 à 7.2 commence simplement par MATLAB. Ce contrôle ne classe les fichiers qu’à partir de ces deux marqueurs : un fichier MATLAB 4 n’en montre aucun et aboutit donc au message de repli — mais scipy.io.loadmat l’ouvre quand même ; considérez donc ce résultat comme une invitation à essayer loadmat directement plutôt que comme la preuve que le fichier est illisible. En règle générale, utilisez d’abord scipy.io.loadmat lorsque le fichier est en version 7.2 ou antérieure, utilisez h5py pour les fichiers 7.3, choisissez mat4py lorsque vous voulez de simples listes Python plutôt que des tableaux NumPy à partir d’un fichier classique, et n’utilisez matlab.engine que lorsque MATLAB lui-même est installé et que vous avez besoin d’une fidélité totale pour les types complexes. Une fois les variables dans Python, pandas peut les exporter en CSV ou en Excel, et scipy.io.savemat ou un jeu de données HDF5 peut réécrire un fichier .mat si vous en avez besoin plus tard.

Les sections ci-dessous utilisent sample.mat (un fichier classique) et sample_v73.mat (un fichier 7.3), supposés contenir une variable nommée measurements. Ces extraits sont propres à chaque dépendance : ils supposent que le paquet nommé est installé, alors exécutez-les dans votre propre environnement plutôt que dans un interpréteur sans dépendance installée.

Lire les fichiers MATLAB avec SciPy

Installez la bibliothèque avec pip install scipy, puis appelez scipy.io.loadmat("sample.mat"). Elle renvoie un dictionnaire : en plus de vos variables, il contient les clés de métadonnées __header__, __version__ et __globals__, et chaque variable MATLAB devient un tableau NumPy sous son nom d’espace de travail, de sorte que data["measurements"] récupère directement cette variable.

Deux options sont utiles à connaître lorsque les dimensions semblent incorrectes. Passer squeeze_me=True à loadmat élimine les dimensions singletons de MATLAB, de sorte qu’un scalaire est renvoyé comme un scalaire, et la combiner avec struct_as_record=False vous permet d’atteindre les champs d’une structure comme des attributs plutôt que comme des éléments de tableau imbriqués. Pour écrire des résultats dans un fichier, scipy.io.savemat("out.mat", {"measurements": data["measurements"]}) produit un fichier MAT classique.

La limite de version est la restriction importante : loadmat ne prend en charge les formats de fichiers MAT que jusqu’à la version 7.2. Avec un fichier 7.3, il signale le format comme non pris en charge, car la charge utile est HDF5 — ce fichier nécessite l’approche de la section suivante. Si vous contrôlez le côté MATLAB, l’enregistrement avec save data.mat -v7 produit un fichier que loadmat accepte.

Lire les fichiers MATLAB 7.3 avec h5py

Un fichier -v7.3 est un fichier HDF5 avec un bloc utilisateur MATLAB, donc pip install h5py suffit pour l’ouvrir. h5py.File("sample_v73.mat", "r") ouvre le fichier en lecture, et list(f.keys()) affiche les groupes de premier niveau — un par variable MATLAB plus un groupe #refs# qui stocke le contenu partagé des cellules et des structures.

La lecture de f["measurements"][()] matérialise le jeu de données sous forme de tableau NumPy ; NumPy ne fait ici que convertir les données, puisque c’est h5py qui a ouvert le fichier. Deux détails de disposition comptent en pratique. MATLAB écrit les tableaux selon l’ordre colonne-major, donc un jeu de données 2-D est généralement renvoyé transposé, et f["measurements"][()].T restaure l’orientation MATLAB. Les cellules et les structures arrivent sous forme de références d’objets HDF5 pointant vers #refs# ; vous devez donc déréférencer chaque entrée avec f[ref] au lieu de la lire directement.

Lire les fichiers MATLAB avec mat4py

pip install mat4py vous donne une API plus réduite destinée aux fichiers MAT classiques. Après from mat4py import loadmat, l’appel de loadmat("sample.mat") renvoie un dictionnaire ordinaire dans lequel les tableaux numériques sont des listes Python imbriquées et les structures deviennent des dictionnaires imbriqués — pratique lorsque vous voulez les données sous forme de types Python purs sans faire appel à NumPy.

Considérez mat4py comme un lecteur pour les formats classiques : il n’ouvre pas les fichiers HDF5 7.3, et les structures MATLAB profondément imbriquées ou inhabituelles peuvent ne pas être correctement converties ; il ne se substitue donc pas à tous les fichiers MAT. Vérifiez la conversion d’un fichier complexe par rapport à scipy.io avant de vous appuyer dessus.

Lire les fichiers MATLAB avec l’API MATLAB Engine

Lorsque MATLAB lui-même est installé, son API Engine pour Python est l’option la plus fidèle. L’installation de matlabengine avec pip (ou l’exécution de l’installateur fourni avec MATLAB) expose matlab.engine, qui pilote une véritable session MATLAB en arrière-plan. eng = matlab.engine.start_matlab() lance cette session, eng.load("sample.mat") charge chaque variable dans l’espace de travail du moteur quelle que soit la version du fichier, et eng.quit() la ferme lorsque vous avez terminé. Les valeurs reviennent sous forme de types MATLAB tels que matlab.double, que NumPy convertit avec np.asarray.

Les compromis sont pratiques plutôt que liés au format : le moteur nécessite une installation MATLAB sous licence et une version du moteur correspondante, la session prend quelques secondes à démarrer, et il ne peut pas fonctionner dans un environnement Python ordinaire. C’est aussi pourquoi cette section montre les appels directement dans le texte plutôt que sous forme d’exemple autonome — les autres bibliothèques constituent le bon choix par défaut lorsque MATLAB n’est pas déjà sur la machine.