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 :
rasterioxarray+cfgribGDAL(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() |

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 |
