2010-05-19 154 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])