Je dois lire et écrire des données binaires, où chaque élément de données: p>
est-il possible sans utiliser de module externe? Si oui, p>
5 Réponses :
Je pense que vous êtes le mieux en utilisant le tableau code>
module. Il stocke des données dans l'ordre des octets système par défaut, mais vous pouvez utiliser array.byteswap () code> pour convertir entre les commandes d'octets, et vous pouvez utiliser
sys.byteorder code> pour interroger le système ordre d'octet. Exemple:
Plus généralement, voir que l'OP en vigueur veut un fichier_byteorder code> arg, utilisez
si sys.byteorderner! = File_byteorder: B.Byteswap () Code> En entrée et à la sortie.
@John: C'est pourquoi j'ai écrit "exemple" ci-dessus :)
from array import array # Edit: from sys import byteorder as system_endian # thanks, Sven! # Sigh... from os import stat def read_file(filename, endian): count = stat(filename).st_size / 2 with file(filename, 'rb') as f: result = array('h') result.fromfile(f, count) if endian != system_endian: result.byteswap() return result
array.fromfile () code> prend toujours deux paramètres.
Pouah. C'est totalement gênant. :(
envisager d'utiliser p>
où structure.unpack (byeorder + str (len (Rawbytes) // 2) + "H", Rawbytes) Code> P>
byeorder code> est
'<' code> ou
'>' code> tel que désiré et de même pour l'emballage. Remarque: Je ne prétends pas que cela soit plus rapide que la méthode code> code>, mais que je notez que la méthode
TRAY code> nécessite parfois un
supplémentaire de BYTESWAP code> étape. p>
Le struct code> way toujours i> a besoin d'un
supplémentaire () code> étape. La principale différence est que vous vous retrouverez avec une liste Python, pendant que vous obtenez un tableau lorsque vous utilisez
array.fromfile () code>.
J'ai trouvé cela utile pour lire / écrire les données d'un fichier binaire dans une matrice numpue: espère que cela aide. p> p>
Comme demandé, sans aucun modules externes: dans la liste de compréhension, nous lisons tous les deux octets. Ensuite, avec une opération bitwise, nous concatéons ces 2 octets. Cela dépend de l'endianess pour savoir où écrire i + 1 code> et
i code> p> p> p>
Avez-vous regardé le module de structure de Python?
Je dirais que le module de struct serait le meilleur endroit pour commencer
L'utilisation de
struct code> serait tout à fait inefficace, cependant, car vous devriez déballer les valeurs un par un.
@Sven Marnach: Avez-vous mesuré cela?
@ S.Lott: Oui, en répondant à Cette question l'an dernier. Je ne me souviens pas des chiffres exacts.
@Sven Marnach: "" "Déballez les valeurs un par un" ""? Considérons
structure.unpack (byeorder / Str (len (Rawbytes) // 2) + "h", Rawbytes) code> où
byeorder code> est
<< / code> ou
> code> comme vous le souhaitez. Remarque: Je ne prétends pas que cela soit plus rapide que la méthode code> code>, mais que je notez que la méthode
TRAY code> nécessite parfois un
supplémentaire de BYTESWAP code> étape.
@John: Vous avez parfaitement raison, je ne me souviens pas que vous pouvez utiliser un compte répété. Les mesures que j'ai faites pour la question liée ne s'appliquent pas à cette affaire.