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
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?
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
Lecture fichier .Bin
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
Le Tout est souvent plus grand que la somme de ses parties.