2017-04-26 2 views
2

Ceci est un fichier binaire avec une structure très simple à des fins d'apprentissage. Chaque registre a trois nombres: un flottant de 32 bits, un flottant de 64 bits et un autre flottant de 32 bits. Si je vide sur l'écran en hexadécimal, il ressemble à ceci:Comment lire un fichier binaire avec un flottant 32 bits, un flottant 64 bits et un autre flottant 32 bits en Python

0000000: 0800 0000 0000 0000 0000 0000 0800 0000 ................ 
0000010: 0800 0000 0000 0000 0000 f03f 0800 0000 ...........?.... 
0000020: 0800 0000 182d 4454 fb21 0940 0800 0000 [email protected] 

(...)

Si je copier manuellement la troisième ligne au format binaire, je peux le lire en trois variables:

import struct 
data = b'\x08\x00\x00\x00\x18-DT\xfb!\[email protected]\x08\x00\x00\x00' 
l1, value, l2 = struct.unpack("<idi", data) 
# (8, 3.141592653589793, 8) 

qui fonctionne, mais je dois lire le fichier à partir du disque, non seulement la copie manuellement chaque registre en binaire, parce que je dois le faire avec des millions de données. J'ai besoin de quelque chose d'équivalent à la commande suivante utilisée dans les fichiers ASCII:

l1, value, l2 = pylab.loadtxt('./test_file.binary',unpack=True) 

Ce qui ne fonctionne pas ici.

+0

est-ce le fichier entier ou y a-t-il plus de données dans le fichier? S'il y en a plus, qu'espérez-vous retrouver dans vos trois variables? –

+0

Il y a plusieurs millions de registres (ou lignes ou peu importe comment vous les nommez) par fichier. – Mephisto

Répondre

3

Lire le fichier en mode binaire:

def read_stuff(fname='test_file.binary'): 
    with open(fname, mode='rb') as f: 
     while True: 
      data = f.read(16) 
      if len(data) < 16: 
       # end of file 
       return 
      yield struct.unpack("<idi", data) 

Ceci est un générateur. Pour le consommer:

for l1, value, l2 in read_stuff(): 
    ... 
+0

Manquant «si» dans cette déclaration? –

+0

@BillBell réparé, merci. N'hésitez pas à modifier directement la prochaine fois. – wim

+0

def read_stuff (fname = 'fichier_test.binary') SyntaxError: syntaxe invalide et pointe vers la parenthèse fermante. Messages d'erreur cryptiques python. Crier à l'écran après deux heures après cela. Cela devrait être simple. – Mephisto