2013-08-21 223 views
1

我有一個二進制文件,我想用python閱讀。我知道前493個字節是x值,接下來的87個字節是y值,最後的147個字節是z值。我已經寫了一些代碼,應該做到這一點,如下圖所示:在Python中讀取二進制文件

with open("file", "rb") as fileHandle: 
    byte = fileHandle.read(1) 

    datax = [] 
    datay = [] 
    dataz = [] 

    dim_x = 493 
    dim_y = 87 
    dim_z = 147 

    while fileHandle.tell() < dim_x + dim_y + dim_z: 
     byte = fileHandle.read(1) 

     if fileHandle.tell() < dim_x: 
      datax.append(byte) 

     if dim_x < fileHandle.tell() < dim_x + dim_y: 
      datay.append(byte) 

     if dim_x + dim_y < fileHandle.tell() < dim_x + dim_y + dim_z: 
      dataz.append(byte) 

    print fileHandle.tell() 
    print len(fileHandle.read()) 

然而,當我比較fileHandle.tell()len(fileHandle.read())分別產生727和6304250。這意味着我只能獲取我的數據的一部分?我認爲fileHandle.read(1)會逐字節地逐步掃描文件?我在這裏錯過了什麼?

請注意,如何在Python中的簡單輪廓圖中繪製這些數據? matplotlib是要走的路嗎?

+2

Stackoverflow的設計使問題和答案形成了一個未來可以使用的解決方案的存儲庫。一次提出兩個問題打破了這種模式 - 請將其分成兩個問題。 – Brionius

+0

您已經構建了'while'循環,以便它繼續,直到您位於文件中的位置727。顯然你的文件比這更長 - 6304250 + 727 = 6304977字節。爲什麼你認爲你的文件只有727字節長? – Brionius

+0

'len(fileHandle.read())'告訴你讀取了727個文件後,文件中有多少個_unread_字節。如果文件的位置接近這麼長,那麼您必須誤解它的格式。奇怪的是,沒有相同數量的x,y和z值(更不用說它們只有一個字節值)。 – martineau

回答

0

首先,做出初步的比較不嚴格的,即:

if dim_x <= fileHandle.tell() < dim_x + dim_y: 

第二件事:你的文件顯然已經727 + 6304250字節。最後一次讀取的調用返回所有未讀取的剩餘字節。是的,你只能獲得一部分數據,因爲你只需要第一個727字節。

雖然有很多更高效和pythonic的方式來做到這一點。

0

[我只是Python的初學者,所以我可能誤解了一些事情。]

我可以看到有該程序的一些問題,可能只有一個解釋,你看到的數字。

  1. 該文件的第一個字節由程序的第二行讀取,因此不保存爲X值。你應該刪掉那一行。

  2. 當tell()的值爲493或580時,您的if語句不執行任何操作。您需要幾個< =。像這樣的東西會趕上他們:

if fileHandle.tell() < dim_x: 
     datax.append(byte) 

    if dim_x <= fileHandle.tell() < dim_x + dim_y: 
     datay.append(byte) 

    if dim_x + dim_y <= fileHandle.tell() < dim_x + dim_y + dim_z: 
     dataz.append(byte) 
  1. 如果您的文件是完全493 + 87 + 147 = 727字​​節長,你實際上已經閱讀超出文件的末尾由三個字節組成。我不確定當你這樣做會發生什麼。可能是一個錯誤消息。

  2. 最後一行實際上試圖讀取文件中剩下的所有內容。所以它看起來像你的文件比727字節長得多。實際上,我猜測它是727 + 6304250 = 6304977字節長。

+0

你說得對。我誤解了文檔。實際上,該文件是由493x87x147元素組成的矩陣,可以提供正確的字節數。 – thomasandersen

+0

不要忘記將問題標記爲已回答! –