我要將用于讀取二進制檔案的作業 matlab 代碼轉換為 python 代碼。是否有等價物
% open the file for reading
fid=fopen (filename,'rb','ieee-le');
% first read the signature
tmp=fread(fid,2,'char');
% read sizes
rows=fread(fid,1,'ushort');
cols=fread(fid,1,'ushort');
uj5u.com熱心網友回復:
有struct 模塊可以做到這一點,特別是unpack接受緩沖區的函式,但是您必須使用從輸入中讀取所需的大小struct.calcsize
import struct
endian = "<" # little endian
with open(filename,'rb') as f:
tmp = struct.unpack(f"{endian}cc",f.read(struct.calcsize("cc")))
tmp_int = [int.from_bytes(x,byteorder="little") for x in tmp]
rows = struct.unpack(f"{endian}H",f.read(struct.calcsize("H")))[0]
cols = struct.unpack(f"{endian}H",f.read(struct.calcsize("H")))[0]
您可能希望使用struct.Struct類以塊的形式讀取其余資料,因為它比一次解碼一個數字要快。IE:
data = []
reader = struct.Struct(endian "i"*cols) # i for integer
row_size = reader.size
for row_number in range(rows):
row = reader.unpack(f.read(row_size))
data.append(row)
編輯:更正了答案,并為更大的塊添加了一個示例。
Edit2:好的,更多改進,假設我們正在讀取 1 GB 的短褲檔案,將其存盤為 python int 沒有意義,并且很可能會出現記憶體不足錯誤(或系統將凍結),正確的方法是使用麻木的
import numpy as np
data = np.fromfile(f,dtype=endian 'H').reshape(cols,rows) # ushorts
這樣,它在記憶體中的空間與在磁盤上的空間相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522627.html
