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éthodeTRAY code> nécessite parfois unsupplé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.