Comment Lire et Décoder un Fichier .bin avec Python ?

Qu’est-ce qu’un fichier .bin ?

Un fichier .bin est un fichier binaire, c’est-à-dire qu’il contient des données brutes (au format binaire — des 0 et des 1), et non du texte lisible.
Contrairement à un fichier texte, vous ne pouvez pas simplement l’ouvrir avec un éditeur et le lire : son contenu doit être interprété par un programme spécifique ou selon une structure connue.

En d’autres termes :

.bin n’est qu’une extension générique — il peut contenir n’importe quoi : des nombres, des images, des mesures de capteurs, voire du code exécutable.

Ainsi, avant de lire un fichier .bin, il faut savoir comment les données ont été écrites (par exemple : float32, int16, forme du tableau, ordre des octets, etc.).

Les fichiers binaires .bin sont souvent accompagnés de fichiers de métadonnées tels que .hdr ou .ctl.
Vous devez toujours lire le fichier d’en-tête correspondant en premier — par exemple pour extraire des informations importantes comme le byte_order (ordre des octets).

Selon le type de données, plusieurs options s’offrent à vous.

Utiliser NumPy — pour les données numériques structurées

Si votre fichier .bin contient une séquence de nombres (par exemple des données de capteurs, des images, des matrices, etc.) :

1
2
3
4
5
6
import numpy as np

# Exemple : lecture d’un fichier binaire de nombres flottants 32 bits
data = np.fromfile('data.bin', dtype=np.float32)

print(data[:10])  # affiche les 10 premières valeurs

Vous pouvez ensuite remodeler le tableau si vous connaissez la taille prévue :

1
data = data.reshape((100, 200))  # par ex. image de 100x200

Si vous ne connaissez pas le type (float32, int16, etc.), consultez les métadonnées ou la documentation du fichier.

Utiliser la fonction intégrée open() de Python

Pour des fichiers binaires généraux (structure inconnue ou mixte) :

1
2
with open('file.bin', 'rb') as f:  # 'rb' signifie "read binary"
    content = f.read()

La variable content contient alors un objet de type bytes. Vous pouvez l’interpréter avec le module struct :

1
2
3
4
5
6
import struct

# Supposons que chaque enregistrement soit un nombre flottant 32 bits (4 octets)
floats = struct.iter_unpack('f', content)
for value, in floats:
    print(value)

Remarque : soyez prudent — si le fichier est très volumineux, l’afficher entièrement peut ralentir ou bloquer le programme.

Les codes de format struct ('f', 'i', 'd', etc.) définissent la façon d’interpréter les octets.

Lecteurs spécialisés

Certains fichiers .bin correspondent à des formats scientifiques connus :

Données satellites (MODIS, GOES, etc.) — possèdent souvent des fichiers .bin accompagnés de métadonnées (.hdr, .ctl, etc.) et peuvent être lus avec :

  • rasterio
  • xarray + cfgrib
  • GDAL (si le format est reconnu)

Exemple :

1
2
3
4
import rasterio

with rasterio.open('image.bin') as src:
    arr = src.read(1)

S’il existe un fichier .hdr ou .xml associé, il décrit généralement la structure des données (nombre de lignes/colonnes, type de données, etc.).

Résumé

Cas Type de fichier Méthode de lecture Bibliothèque
Nombres bruts (float, int) Binaire séquentiel np.fromfile() NumPy
Mixte / personnalisé Inconnu open(..., 'rb') + struct Python natif
Géospatial / télédétection Avec métadonnées (.hdr, .xml) rasterio, xarray, gdal Pile GDAL

Exemple Pratique

Prenons un exemple concret avec les données du produit NOAA RAVE.
La documentation de référence est disponible ici.

L’un des jeux de données utilisés dans RAVE — les cartes de couverture terrestre et d’écorégions — peut être téléchargé depuis South Dakota State University.
Ces données fournissent des classifications spatiales détaillées des types de surface et des écorégions en Amérique du Nord.

Pour plus d’informations et de détails sur la classification, vous pouvez consulter le jeu de données Ecoregions of North America fourni par l’Agence américaine de protection de l’environnement (EPA), qui définit les régions écologiques selon le climat, la végétation, le sol et l’utilisation des terres.

La présence d’un fichier .hdr indique généralement que le fichier .bin est au format ENVI raster (courant en télédétection), ou dans un autre format binaire raster.
Le fichier .hdr contient les métadonnées décrivant les données binaires : nombre de lignes/colonnes, type de données, ordre des octets, type d’entrelacement, etc.

Vérifier le fichier .hdr

C’est un fichier texte simple. Vous pouvez l’ouvrir pour voir les métadonnées :

1
2
with open("ecoregion_ecosystem_pt03degree_NorthAmerica_G2.hdr", "r") as f:
    print(f.read())

Vous verrez typiquement quelque chose comme :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ENVI
description = {
  File Imported into ENVI.}
samples = 6240
lines   = 2610
bands   = 2
header offset = 0
file type = ENVI Standard
data type = 2
interleave = bip
sensor type = Unknown
byte order = 0
wavelength units = Unknown
map info = {Geographic Lat/Lon, 1, 1, 144.975, 81.785, 0.03, 0.03,WGS-84}
coordinate system string = {GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]}

Points clés à retenir :

  • samples → nombre de colonnes
  • lines → nombre de lignes
  • bands → nombre de bandes (1 pour niveaux de gris, >1 pour multispectral)
  • data type → code numérique (codes ENVI, ex. : 4 = flottant 32 bits)
  • interleave → mode de stockage (bsq, bil, bip)
  • byte order → 0 = little endian, 1 = big endian

Lecture du fichier .bin avec NumPy

Vous pouvez associer le code data type d’ENVI au type dtype de NumPy :

Code ENVI Type NumPy
1 np.uint8
2 np.int16
3 np.int32
4 np.float32
5 np.float64
12 np.uint16

Exemple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# Paramètres extraits du fichier .hdr
n_rows = 2610
n_cols = 6240
n_bands = 2
dtype = np.int16  # type ENVI 2
byte_order = '<'  # 0 = little endian

# Lecture du fichier binaire
data = np.fromfile('ecoregion_ecosystem_pt03degree_NorthAmerica_G2.bin', dtype=byte_order + 'i2')

# Remodelage selon l’entrelacement BIP
data = data.reshape((n_rows, n_cols, n_bands))

print("Forme des données :", data.shape)  # devrait être (2610, 6240, 2)
print("Type de données :", data.dtype)

# Exemple : accéder à la première bande
image1 = data[:, :, 0]
image2 = data[:, :, 1]

Tracer les données avec Matplotlib :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

# Exemple de visualisation
fig, ax = plt.subplots(figsize=(8, 6))
im = ax.imshow(image1, cmap='gray')

# Ajouter une barre de couleur à droite
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
plt.colorbar(im, cax=cax)

ax.set_title("Image1")
plt.tight_layout()
plt.savefig("read_bin_file_01.png", dpi=100, bbox_inches='tight')
plt.show()

Comment Lire un Fichier .bin avec Python ?
Comment Lire un Fichier .bin avec Python ?

Optionnel : Utiliser rasterio pour plus de commodité

Si le fichier .hdr est reconnu, vous pouvez aussi utiliser rasterio :

1
2
3
4
5
import rasterio

with rasterio.open('file.bin') as src:
    img = src.read(1)  # lecture de la première bande
    print(img.shape)

Remarque : parfois, rasterio nécessite que le fichier .hdr soit renommé en .img avec le même nom de base.
Sinon, la lecture manuelle avec NumPy reste la méthode la plus sûre.

Références

Lien Site
https://docs.python.org/3/library/struct.html Documentation officielle Python pour la lecture de données binaires avec le module struct
https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files Tutoriel Python sur la lecture et l’écriture de fichiers (y compris en mode binaire)
https://numpy.org/doc/stable/reference/generated/numpy.fromfile.html Documentation NumPy sur la lecture directe de données binaires dans des tableaux
Image

of