pythonバイナリファイルの読み取り

7259 ワード

最近pythonで読み込みました.RIntフォーマットのバイナリファイルは、c++に対応して次の変数が格納されている場合に共有されます.
char a[512];			
unsigned char b;	
unsigned char c;	
uint32_t d;			
....	

如在RIntファイルには、上記のフォーマットのデータが512個のcharの変数a,unsigned charのb,c,uint 32_で格納されているtのd.unsigned charのbとcを読み込むならuint 32_tのdは、ここで読み出したデータフォーマットが:
from io import BufferedReader
import numpy as np  
def loadDataSet(fileName):
    with open(fileName,'rb')as fr:
        fr.seek(512)
        print(np.frombuffer(fr.read(1), dtype=np.uint8))
        print(np.frombuffer(fr.read(1), dtype=np.uint8))
        print(np.frombuffer(fr.read(4), dtype=np.uint32))
    ...
if __name__=='__main__':
    ##    
    dataMat=np.array(loadDataSet(".\***Int")) 

特に注意しなければならないのは、バイナリフォーマット:b'x 00x 01x 05x 02'x 00、x 01は2つの16進数、すなわち8桁charを表す.そうでないとエラーが発生します.
さらに32桁のビット数を読み取るにはdtype=npを用いる必要がある.uint32 :
np.frombuffer(fr.read(4), dtype=np.uint32)

例:
np.frombuffer(b'M|\x23\x17', dtype=np.uint32)
#array([388201549], dtype=uint32)

しかし、データはb’M|の記憶形式に似ていて、まだはっきりしていないので、後で補充します.
また、次のように使用することもできます.
from io import BufferedReader
import numpy as np  
def loadDataSet(fileName):
    with open(fileName,'rb')as fr:
        a_buff = BufferedReader(fr)
        a_byte = BufferedReader.read(a_buff )
        arr = np.frombuffer(a_byte , dtype=np.uint8)
        print(arr[512:])
        ....

ここではnpに統一する.uint 8フォーマットは、使用時にさらに処理する必要があります.