簡體   English   中英

與 IDL 方法相比,在 Python 中使用 unpack 讀取二進制文件

[英]Read a binary file using unpack in Python compared with a IDL method

我有一個讀取二進制文件的 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)不是給出的dtypes的倍數(16)

根據IDL 數據類型表UINT(0)創建一個16 位整數(即兩個字節)。 Python struct模塊中I 格式字符表示 4 字節整數, H表示無符號 16 位整數。

嘗試更改解包a的行

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

不幸的是,這可能無法解決問題。 您將選項/f77_unformattedopenr /f77_unformatted使用,這意味着該文件包含的不僅僅是變量的原始字節。 (有關/f77_unformatted更多信息,請參閱OPENR 命令文檔。)

您可以嘗試使用scipy.io.FortranFile來讀取文件,但沒有保證它會起作用。 未格式化的 Fortran 文件的二進制布局取決於編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM