pythonバイナリファイルの読み取り
7259 ワード
最近pythonで読み込みました.RIntフォーマットのバイナリファイルは、c++に対応して次の変数が格納されている場合に共有されます.
如在RIntファイルには、上記のフォーマットのデータが512個のcharの変数a,unsigned charのb,c,uint 32_で格納されているtのd.unsigned charのbとcを読み込むならuint 32_tのdは、ここで読み出したデータフォーマットが:
特に注意しなければならないのは、バイナリフォーマット:b'x 00x 01x 05x 02'x 00、x 01は2つの16進数、すなわち8桁charを表す.そうでないとエラーが発生します.
さらに32桁のビット数を読み取るにはdtype=npを用いる必要がある.uint32 :
例:
しかし、データはb’M|の記憶形式に似ていて、まだはっきりしていないので、後で補充します.
また、次のように使用することもできます.
ここではnpに統一する.uint 8フォーマットは、使用時にさらに処理する必要があります.
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フォーマットは、使用時にさらに処理する必要があります.