[英]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_unformatted
與openr
/f77_unformatted
使用,這意味着該文件包含的不僅僅是變量的原始字節。 (有關/f77_unformatted
更多信息,請參閱OPENR 命令的文檔。)
您可以嘗試使用scipy.io.FortranFile
來讀取文件,但沒有保證它會起作用。 未格式化的 Fortran 文件的二進制布局取決於編譯器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.