gpt4 book ai didi

python - Python 中使用 unpack 读取二进制文件与 IDL 方法的比较

转载 作者:行者123 更新时间:2023-12-01 09:02:02 30 4
gpt4 key购买 nike

我有一个读取二进制文件的 IDL 过程,并尝试将其转换为 Python 例程。IDL 代码如下所示:

a = uint(0)
b = float(0)
c = float(0)
d = float(0)
e = float(0)
x=dblarr(nptx)
y=dblarr(npty)
z=dblarr(nptz)
openr,11,name_file_data,/f77_unformatted
readu,11,a
readu,11,b,c,d,e
readu,11,x
readu,11,y
readu,11,z

它工作得很好。所以我在 python 中写了同样的东西,但我找不到相同的结果(甚至“a”的值不同)。这是我的代码:

x=np.zeros(nptx,float)
y=np.zeros(npty,float)
z=np.zeros(nptz,float)
with open(name_file_data, "rb") as fb:
a, = struct.unpack("I", fb.read(4))
b,c,d,e = struct.unpack("ffff", fb.read(16))
x[:] = struct.unpack(str(nptx)+"d", fb.read(nptx*8))[:]
y[:] = struct.unpack(str(npty)+"d", fb.read(npty*8))[:]
z[:] = struct.unpack(str(nptz)+"d", fb.read(nptz*8))[:]

希望对大家的回答有所帮助。

更新:正如答案中所建议的,我现在正在尝试模块“FortranFile”,但我不确定我是否理解有关其使用的所有内容。

from scipy.io import FortranFile
f=FortranFile(name_file_data, 'r')
a=f.read_record('H')
b=f.read_record('f','f','f','f')

但是,我得到的不是“a”的整数,而是:array([0, 0], dtype=uint16)。

对于“b”,我遇到以下错误:获得的大小 (1107201884) 不是给定数据类型 (16) 的倍数

最佳答案

根据a table of IDL data typesUINT(0) 创建一个 16 位整数(即两个字节)。在 Python struct moduleI format character表示 4 字节整数,H 表示无符号 16 位整数。

尝试将解压 a 的行更改为

    a, = struct.unpack("H", fb.read(2))

不幸的是,这可能无法解决问题。您可以将选项 /f77_unformattedopenr 一起使用,这意味着该文件不仅仅包含变量的原始字节。 (有关 /f77_unformatted 的更多信息,请参阅 documentation of the OPENR command。)

您可以尝试使用scipy.io.FortranFile读取该文件,但不能保证它会起作用。未格式化的 Fortran 文件的二进制布局取决于编译器。

关于python - Python 中使用 unpack 读取二进制文件与 IDL 方法的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52386182/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com