IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Lecture de fichier binaire [Python 3.X]


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2014
    Messages : 40
    Points : 33
    Points
    33
    Par défaut Lecture de fichier binaire
    Bonjour,

    Je souhaiterais lire un fichier binaire donc je connais la structure.
    J'ai, par exemple,

    Un entier
    10 caractères suivi de 10 caractères
    5 entiers
    4 réels

    etc...

    J'ai essayé la fonction "fromfile" provenant de la bibliothèque numpy mais ça me ressort des choses commes 7.1218484E+387 (rien de cohérent avec ce que contient le fichier donc). Je me doutais que ça ne serait pas aussi simple.
    Néanmoins, je ne trouve pas de recette pour la lecture de ce type de fichier.
    Pourriez-vous m'aider ou m'orienter vers des exemples plus concrets ?

    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour lire le fichier il faut utiliser l'option "rb" de open pour le lire en binaire (chaine d'octets). Avec Python 3, on obtient une chaine de type "bytes".

    Ensuite, le module struct permet de faire toutes les extractions nécessaires si on fournit le format.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2014
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Bonjour,

    J'ai essayé mais j'ai du mal à comprendre comment ça fonctionne
    Je sais que sur les 4 premiers octet j'ai un entier

    J'ai essayé quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with open("test.bin", "rb") as f:
        test=f.read()[0:4]
        test=struct.unpack('i',test)
        print(test)
    Mais marche pas très bien ça me renvoit 67108864 (je dois trouvé quelque chose comme 0 ou 1 ><)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par coolpix77 Voir le message
    Mais marche pas très bien ça me renvoit 67108864 (je dois trouvé quelque chose comme 0 ou 1 ><)
    Postez les valeurs hexadécimales de ces 4 bytes lus.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2014
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    En fait c'était parce que j'étais pas en BIG ENDIAN :o

    Parce que l'hexadécimal c'est b'00000004' donc à priori le résultat c'est 4 (après pourquoi ce n'est pas 0 ou 1 c'est une autre question )

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Citation Envoyé par coolpix77 Voir le message
    Parce que l'hexadécimal c'est b'00000004' donc à priori le résultat c'est 4 (après pourquoi ce n'est pas 0 ou 1 c'est une autre question )
    Par lecture d'un fichier en binaire il faut comprendre : sans interprétation des octets, mais sa représentation/manipulation n'est pas en binaire mais en octets (type bytes).

    1. 'r' pour une lecture d'un texte, qui du coup implique un encodage pour pouvoir convertir des octets en caractères, ascii, utf-8 (...)
      avec notamment la réinterprétation des sauts de lignes "\r\n" "\r" "\n" qui seront remplacés par "\n" :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      with open("texte.txt", 'r') as file:
          for line in file: # line est de type string contenant le caractère de saut de ligne qui sera toujours "\n"
              print(type(line), repr(line), line.strip())
      On peut aussi utiliser line = file.readline() qui fait la même chose que for line in file.
      On récupère des données de type string avec un encodage implicite utf-8 par défaut.
    2. 'rb' ne fait aucune interprétation des données, il ouvre donc le fichier en binaire.
      Ici les fonctions .read() et .readline() retournerons du type bytes et conserverons les caractère d'origines de sauts de lignes.
      Le type bytes est représenté sous cette forme : b'abcdef\r\n'

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      with open("texte.txt", 'rb') as file:
          for line in file: # line est de type bytes contenant le caractère de saut de ligne
              print(type(line), repr(line), line.strip())
      La représentation qui est donné bien qu'ouvert en binaire est affiché en octets avec en plus la représentation ASCII pour les caractères imprimables plutôt que le code hexadécimal.

      Qui donne ceci:

      "envolée".encode() # Le "é" implique que le fichier ou l'entrée console soit encodée en utf-8.
      Affichera en bytes : b'envol\xc3\xa9e'

      Mais on peut très bien inscrire sa valeur en hexadécimal: b'\x61\x62\x63'
      Simplement son affichage python sera présenté sous cette forme: b'abc'

      Après si c'est juste une représentation binaire qu'il vous faut il suffit juste d'utiliser la fonction bin() sur chacun des octets:

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      [bin(x) for x in b'\x61\x62\x63']
      Affichera : ['0b1100001', '0b1100010', '0b1100011'] # Liste de string

      Ou plus souple avec la fonction str().format() :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ["0b{:08b}".format(x) for x in b'\x61\x62\x63']
      Affichera : ['0b01100001', '0b01100010', '0b01100011']

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Août 2014
    Messages : 40
    Points : 33
    Points
    33
    Par défaut
    Merci pour la réponse compléte, je vais lire ça en détail

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture de fichier binaire
    Par nuans dans le forum MATLAB
    Réponses: 23
    Dernier message: 21/05/2007, 10h00
  2. Lecture de fichier binaire et gestion de fin de fichier
    Par habasque dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 02/05/2007, 17h06
  3. lecture ecriture fichier binaire
    Par jonckers dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/04/2007, 09h12
  4. Réponses: 5
    Dernier message: 26/03/2007, 01h30
  5. lecture de fichier binaire
    Par Salim6 dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 19h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo