Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture fichier .Bin

Migration d'un programme Python 2 en Python 3

    29 novembre 2024 à 17:25:05

    Bonjour à tous,

    Je suis en train de convertir en Python un programme créé par un collègue il y a plusieurs années en Python2.

    Celui-ci consiste à récupérer le contenu de fichiers .BIN afin d'en exploiter les données.

    Après quelques petits aménagements classiques pour passer de py2 à py3, le programme se lance correctement sur les 1er fichiers.

    Seulement, arrivé sur l'un d'entre-eux j'ai le message :

    "UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 23: character maps to <undefined>"

    Je ne vais pas vous remettre tous le programme qui réalise aussi la mise en page dans un fichier destination, cela a je pense peu d'intérêt, mais afin de comprendre l'origine du problème, j'ai fait un petit code qui provoque le même problème dans la même situation:

    import binascii as bs
    import codecs
    import time
    
    dataGroup=""
    nom_fichier="S:\LABO-QUALITE\Python\ControleDG\DG\90RF14727-DG2.bin"
    
    f = open(nom_fichier)
    #f = codecs.open(nom_fichier,'rb')
    #f = open(nom_fichier,'rb')
    print("LectureEcritureFichier f ->",f)
    
    data = f.readlines()
    print("data: ",data)
    dataGroup = ""
    for n in range(0,len(data)):
        print(f"data({n}): {data[n]}")
        dataGroup = dataGroup + data[n]
    
    print("dataGroup: ",dataGroup)
    datagroup_h =bs.hexlify(bytes(dataGroup,encoding="utf8")).upper()
    print("datagroup_h :",datagroup_h)
    
    time.sleep(5)
    
    dataGroup=str(bs.unhexlify(datagroup_h).decode("utf-8"))
    print("dataGroup: ",dataGroup)
    
    f.close()

    Ce code me permet d'afficher l'extraction (datagroup_h) de manière lisible afin de comparer les réponse entre py2 et py3

    Si le fichier lu est 90RF14727-DG1.bin, ça marche : Même lecture entre py2 et py3

    Si c'est 90RF14727-DG2.bin, j'ai le message à la commande "data = f.readlines()"

    Alors que sous Py2, ça fonctionne.


    Y a t il une subtilité en py3 qui n'existait pas en py2 ?

    Quel est le problème avec le byte 0x81 ?

    Ca fait plusieurs jours que je sèche complétement. Merci pour votre aide. J'en ai besoin :)


    • Partager sur Facebook
    • Partager sur Twitter
      29 novembre 2024 à 17:43:08

      Apparemment, vous avez omis le 'rb' dans l'open. C'est ce qui fait la différence entre la lecture d'un fichier binaire et celle d'un fichier texte.

      Par ailleurs un fichier binaire n'a pas de lignes... mais on peut lire un fichier texte en mode binaire (et y trouver des '\n')

      -
      Edité par mps 29 novembre 2024 à 18:45:52

      • Partager sur Facebook
      • Partager sur Twitter
        29 novembre 2024 à 23:30:58

        J'ai essayé en ajoutant 'rb'.

        Là effectivement je récupère quelque chose mais les 1er fichiers conforme avec la version py2 ne le sont plus si j'aoute 'rb'. La suite du programme et donc l'interprétation n'est alors plus possible et cela génère d'autres problèmes.

        Ce qui me surprend c'est qu'il n'y a pas non plus de 'rb' dans la version historique en py2 et pourtant les fichier bin sont tous lu.

        De plus pourquoi en py3 cela marche sur certains fichier sans 'rb' mais pas sur tous ?

        Pour le nombre de ligne, en effet vous avez raison. Mais il me suffit de récupérer la seule ligne du fichier pour la suite : je parse les données pour les exploiter.

        J'ai l'impression que c'est la méthode readlines() qui pose problème.

        Est elle limité par le nombre de caractère en py3 et pas en py2?

        Existe t il une alternative à cette méthode ?

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          30 novembre 2024 à 1:21:05

          Si ton fichier n'est pas trop gros, tu pourrais essayer la méthode  file.read() qui lira tout le fichier d'un seul coup.

          text = file.read()

          text sera une chaîne de "caractères".

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            30 novembre 2024 à 8:25:35

            Watxm a écrit:

            J'ai essayé en ajoutant 'rb'.

            Avec Python2, il n'y a pas trop de différence entre open avec et sans 'rb' excepté peut être le traitement des fins de lignes.

            Avec Python3, open équivaut au codecs.open de python2: si on ne met pas 'rb', il va essayer d'en faire de l'unicode en décodant les octets.

            De fait, avec python3, vous n'avez pas le choix, il faut mettre 'rb' sinon ça plantera à la lecture.

            Reste que toutes les fonctions qui traitent des chaines de caractères ont été modifiées: il peut y avoir d'autres soucis liés ou pas au mode de l'open.

            -
            Edité par mps 30 novembre 2024 à 18:17:11

            • Partager sur Facebook
            • Partager sur Twitter

            Lecture fichier .Bin

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown