2017-07-29 85 views
0

我有一個包含8000個粒子位置的二進制文件。 我知道每個粒子的值應該看起來像「-24.6151 ...」(我不知道我的程序給出了哪個精度值,我猜是雙精度(?)。我試着去閱讀這段代碼的文件:在不知道結構的情況下用python讀取二進制文件

In: with open('.//results0epsilon/energybinary/energy_00004.dat', 'br') as f: 
    buffer = f.read() 
    print ("Lenght of buffer is %d" % len(buffer)) 

    for i in buffer: 
     print(int(i)) 

我得到的輸出:

Lenght of buffer is 64000 

10 

168 

179 

43 
... 

我會跳過值的整個列表,但你可以看到這些值都遠離我的期望。我想我有一些解碼錯誤。

我希望任何形式的幫助:)

+1

我可以試試'struct'庫來解壓二進制文件 - https://docs.python.org/3/library/struct.html – pkisztelinski

+0

cn的你使用['struct'](https://docs.python.org/3/library/struct.html)模塊來解壓(或打包)二進制數據。打印(數據) –

回答

4

你現在正在打印是bytes組成的浮點數據。所以它作爲數值是沒有意義的。

當然,有沒有100%肯定的答案,因爲我們沒有看到你的數據,但我會嘗試猜測:

你有8000點的值來讀取和文件大小爲64000。所以,你可能具有double IEEE值(每個8字節)。如果它是而不是 IEEE,那麼你要烤麪包。

在這種情況下,你可以嘗試以下方法:

import struct 
with open('.//results0epsilon/energybinary/energy_00004.dat', 'br') as f: 
    buffer = f.read() 
    print ("Length of buffer is %d" % len(buffer)) 

    data = struct.unpack("=8000d",buffer) 

如果數據印刷假,它可能是一個字節序的問題。因此請將=8000更改爲<8000>8000

參考,打包/解包格式:https://docs.python.org/3/library/struct.html

+0

我得到了如下輸出(-24.615130168305804,-24.61513016830572 ...)。現在我可以進一步處理它。非常感謝你 :) –

相關問題