在知道格式和维度的情况下使用 python 读取二进制文件
Read binary using python while knowing format and dimension
我正在尝试读取一个二进制文件 (float32),其中包含一个格式为小端格式的变量。
这个二进制文件应该给出一个维度为 (8, 480, 1440) 的 3d 变量。
据说没有 header,因为它在另一个文件中给出。
在努力阅读二进制文件并尝试此处看到的不同解决方案之后,我终于能够 运行 我的脚本。但是输出并不像预期的那样(点分布错误),这让我觉得在某个时候出了点问题,虽然我不知道在哪里。
这是代码的一个最小示例,运行 但没有给我预期的结果:
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 里面,但是,由于我对二进制格式和一般的二进制文件不是很熟悉,所以我不知道如何解决这个问题。
任何帮助 and/or 解释将不胜感激!
感谢 stovfl,我解决了这个问题。这是结合了 np.fromfile
和 reshape
.
的代码
cmorph = np.fromfile(file,type=np.float32,count=nvar*ntim*nlat*mlon)).reshape((nvar*ntim,nlat,mlon))
我正在尝试读取一个二进制文件 (float32),其中包含一个格式为小端格式的变量。
这个二进制文件应该给出一个维度为 (8, 480, 1440) 的 3d 变量。 据说没有 header,因为它在另一个文件中给出。
在努力阅读二进制文件并尝试此处看到的不同解决方案之后,我终于能够 运行 我的脚本。但是输出并不像预期的那样(点分布错误),这让我觉得在某个时候出了点问题,虽然我不知道在哪里。
这是代码的一个最小示例,运行 但没有给我预期的结果:
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 里面,但是,由于我对二进制格式和一般的二进制文件不是很熟悉,所以我不知道如何解决这个问题。 任何帮助 and/or 解释将不胜感激!
感谢 stovfl,我解决了这个问题。这是结合了 np.fromfile
和 reshape
.
cmorph = np.fromfile(file,type=np.float32,count=nvar*ntim*nlat*mlon)).reshape((nvar*ntim,nlat,mlon))