-
Portage Struct.unpack
Bonjour,
je développe actuellement une pallication entièrement codée sous python qui doit pouvoir être protable de linux à windows.
La premiere partie de mon algo consiste à recuperer des données brutes à l'aide de la fonction unpack du module struct; ce quie se passe sans probleme avec n'importe quel fichier sous linux.
Pourtant au passage a windows, j'obtiens l'erreur que toute personne ayant utilisé unpack a déjà connu : struct.error: unpack requires a string argument of length 2.
Je ne comprends vraiment pas : l'algo est bien le meme, et la taille des octets est bien la meme d'un systeme à un autre . (je suis sur architecture 32 bits)
Les resultats sont vraiment bizarres, avec certains fichiers, j'en arrive meme a obtenir struct.error: unpack requires a string argument of length 9100!
Est ce que quelqu'un aurait une idée simple que j'aurais omise?
N'hésitez pas si vous avez besoin de compléments
Et merci d'avance!
-
Apres quelques recherches, il s'avère que je vais reponder a mon propre post.
Windows, à l'inverse de mon linux, n'a pas le bon gout d'ouvrir les fichiers de donnees directement en binaire.
Il a donc simplement fallu lui preciser en ouvrant le fichier en mode 'rb'
Voila don cun post resolu, qui n'aura pas fait reflechir grand monde a part moi :p
-
Ta question m’a intéressé mais n’étant pas compétent en module struct , je ne pouvais rien apporter de valable.
Il se trouve que j’ai potassé ce module ce weekend, mais je n’ai pas encore compris de quoi il retourne.
Si quelqu’un peut proposer des liens pour étudier le sujet , j’en serai fort satisfait.
Et merci d’avoir pris la peine d’apporter la réponse à ta question.
-
Bonjour eyquem,
Je suppose que tu as déjà trouvé le manuel :D :
http://docs.python.org/library/struct.html
J'ai déjà utilisé struct pour développer une fonction de lecture directe d'un fichier dbase III (.dbf), sans passer par dbase. Connaissant la place des données dans le fichier, il n'est pas très compliqué de récupérer ces données dans des variables, grâce à struct.unpack. Le principe est d'utiliser une chaine de format qui décrit les données attendues. Cette chaine de format n'est cependant pas toujours facile à écrire (ça me fait un peu penser aux regex...). Et, bien entendu, il faut ouvrir le fichier en mode binaire ('rb'):
http://python.jpvweb.com/mesrecettes.../lecture_dbase
Tyrtamos
-
Merci tyrtamos.
Il faut que je me mette à étudier sérieusement les histoires d’encodage, de bytes, d’unicode et tutti quanti un de ces 4.
À cette occasion je m’aiderai de ton site, parce j’ai remarqué plusieurs posts où tu proposais des codes impliquant ces sujets et qu’il me semble que tu as compris ces histoires un peu compliquées de façon assez approfondie et précise.
Oui, j’ai bien trouvé le manuel. C’est justement la page à laquelle je ne comprends rien.
Il me semble avoir compris qu’en mode ’b’, les flux entrant et sortant d’un fichier sont des bytes bruts, c’est à dire sans interprétation à quelque niveau que se soit.
Par contre en mode ordinaire, il y a un ’bidule’ qui fait une analyse des flux et qui les transforme, en bytes s’il s’agit d’écrire dans un fichier, en caractères s’il s’agit de lecture. Ce bidule est une sorte “d’interpréteur’ de flux de fichier. D’ailleurs, c’est quoi ce ’bidule’ ? C’est un module spécialisé de l’interpréteur Python ?....
En mode’b’, cet interpréteur serait désactivé. Pour écrire il faut alors connaître comment sont organisés les bytes dans le fichier, et cette connaissance se trouve dans un format descriptif du type des bytes dans le fichier.
Pour lire, par contre, en admettant qu’il ne soit pas nécessaire, ou possible , de transformer les bytes en caractères pour donner des chaînes lisibles par un humain, on peut éventuellement se passer de la connaissance du format. .... ??
Une question que je me pose aussi:
est-ce qu’on peut écrire dans un fichier en mode ’wb’, éventuellement autre chose que des caractères, le refermer. Puis le réouvrir en mode ’w’ et écrire à nouveau des caractères ?
Est-ce que tout ceci a un sens ou bien est-ce que je me plante totalement ?
-
Bonjour eyquem.
Je suis loin de maitriser les encodages! J'arrive le plus souvent à résoudre mes pb d'encodage en essayant des solutions jusqu'à ce que ça marche, mais ce n'est guère satisfaisant.
Il m'arrive de me poser les mêmes questions que toi, aussi, je suis en train de creuser un peu le sujet pour répondre. Je ferai un tuto sur ce que j'ai trouvé, et j'en donnerai l'adresse ici. Laisse moi quelques jours.
En attendant, il y a des sites qui disent des choses intéressantes sur le sujet, comme celui-ci:
http://sebsauvage.net/python/charsets_et_encoding.html
Tyrtamos