2010-05-19 114 views
1

我如何去在Python打开二进制数据文件,并在同一时间读回值一个long ,进入结构。我目前所面对的是这样的,但我认为这将继续覆盖idList,我要追加到它,所以我结束了所有的文件中long值的元组 -阅读Python中的二进制文件到一个结构

file = open(filename, "rb") 

     try: 
      bytes_read = file.read(struct.calcsize("=l")) 
      while bytes_read: 

       # Read 4 bytes(long integer) 
       idList = struct.unpack("=l", bytes_read) 

       bytes_read = file.read(struct.calcsize("=l")) 
     finally: 
      file.close() 

感谢。

回答

6

简单(蟒蛇2.6或更高版本):

import array 
idlist = array.array('l') 
with open(filename, "rb") as f: 
    while True: 
     try: idlist.fromfile(f, 2000) 
     except EOFError: break 
idtuple = tuple(idlist) 

元组是不可变的,所以它们不能被逐步建成:所以,你必须建立一个不同(可变)序列,然后调用它tuple在结束。如果你实际上不需要需要特别是一个元组,当然,你可以保存最后一个昂贵的步骤,并保存数组或列表或任何其他东西。无论如何,避免践踏诸如file之类的内置名称是可取的;-)。

如果使用struct模块是最佳的由array模块处理(例如,因为赌注的)工作,

idlist = [ ] 
with open(filename, "rb") as f: 
    while True: 
     bytes_read = f.read(struct.calcsize("=l")) 
     if not bytes_read: break 
     oneid = struct.unpack("=l", bytes_read)[0] 
     idlist.append(oneid) 

with声明(2.5也可与导入未来)比旧的尝试/最后清晰简明。

+0

感谢。不幸的是,我们目前仅限于使用Python 2.5,这与此有何不同? – 2010-05-19 14:04:46

+0

@Adam,只需在模块的开头添加'from __future__ import with_statements'即可。 – 2010-05-19 14:06:16

+0

在数组示例中,您从文件调用的值为2000,如果不是4,那么对于四字节整数?或者我误解了这个功能? – 2010-05-19 14:19:36

0

变化

idList = struct.unpack("=l", bytes_read) 

idList.append(struct.unpack("=l", bytes_read)[0])