2017-05-08 3 views
0

형식이 리틀 엔디안 인 변수 하나를 포함하는 바이너리 파일 (float32)을 읽으려고합니다.형식 및 치수를 알고있는 동안 파이썬을 사용하여 바이너리 읽기

이 바이너리는 차원 (8, 480, 1440)이있는 3D 변수를 제공해야합니다. 다른 파일에 주어진대로 헤더가 없습니다.

바이너리를 읽는 데 많은 어려움을 겪고 여기에서 보았던 여러 가지 솔루션을 시도해 본 결과 마침내 스크립트를 실행할 수있었습니다. 그러나 결과는 예상대로 (포인트 분배가 잘못되었습니다.) 어느 부분에서 잘못되었다고 생각됩니다. 여기

은 실행되지만 예상 된 결과 나에게 포기하지 않았다 코드의 최소한의 예입니다

filename=["CMORPH_3HLY_19980102"] 
with open(filename[0], mode='rb') as file: 
     fileContent = file.read() 

data=struct.unpack("f" * (len(fileContent) // 4), fileContent) 

nvar = 1          
ntim = 8 
nlat = 480 
mlon = 1440 
data_ok=np.array(data) 

cmorph=data_ok.reshape((mlon,nlat,nvar*ntim)).transpose() 

나는 매우 익숙하지 나처럼 문제의 struct.unpack 안에 무엇에서 유래하지만, 생각 이진 형식과 이진 파일을 일반적으로 사용하면이 문제를 해결할 방법을 알 수 없습니다. 도움이나 의견을 보내 주시면 감사하겠습니다.

+0

데이터 유형은 무엇입니까? 32 비트 ints? –

+0

32 바이트의 부동 소수점이라고 생각합니다. 이것은 동일한 데이터를 읽는 matlab 스크립트에서 사용되는 것입니다. 확실한 방법이 있습니까? 문서에 따르면 각 레코드에는 실제 * 4 데이터 배열이 포함되어 있습니다. – dcoppin

+0

'np.fromfile (file [, dtype, count, sep]) '을 사용하지 않는 이유 \t 텍스트 또는 바이너리 파일의 데이터로부터 배열을 생성하십시오. – stovfl

답변

0

stovfl 덕분에이 문제가 해결되었습니다. 다음은 np.fromfilereshape을 결합한 코드입니다.

cmorph = np.fromfile(file,type=np.float32,count=nvar*ntim*nlat*mlon)).reshape((nvar*ntim,nlat,mlon)) 
관련 문제