2017-04-26 657 views
2

这是一个结构非常简单的用于学习目的的二进制文件。每个寄存器有3个数字:一个32位浮点数,一个64位浮点数和另一个32位浮点数。如果我放弃它在十六进制在屏幕上,它看起来像这样:如何在Python中使用32位浮点数,64位浮点数和另一个32位浮点数读取二进制文件

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] 

(...)

如果我手动复制二进制格式第三行,我可以读入三个变量:

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) 

这样的作品,但我需要从磁盘中读取文件,不仅手动复制二进制每个寄存器,因为我需要数以百万计的数据来做到这一点。我需要一些与ascii文件中使用的以下命令等效的东西:

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

这不起作用。

+0

这是整个文件还是文件中有更多数据?如果还有更多,那么你期望回到你的三个变量? –

+0

每个文件有数百万个寄存器(或行,或者您的名字)。 – Mephisto

回答

3

阅读二进制模式的文件:

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) 

这是一台发电机。要使用它:

​​
+0

在这一条语句中缺少'if'? –

+0

@BillBell修复,谢谢。随时可以直接编辑。 – wim

+0

def read_stuff(fname ='test_file.binary') SyntaxError:语法无效,它指向右括号。神秘的python错误消息。在此之后的两个小时后大声喧哗。它应该很简单。 – Mephisto