如何在Python中读取Big或Lower-Endian格式的文件
我正在尝试将一个脚本从Matlab更新为Python,但在一个小节中遇到了问题。代码应该是读取一个二进制文件并将其转换成我可以用来绘制图的东西 我遇到问题的MatLab代码如下:如何在Python中读取Big或Lower-Endian格式的文件,python,matlab,io,binary,endianness,Python,Matlab,Io,Binary,Endianness,我正在尝试将一个脚本从Matlab更新为Python,但在一个小节中遇到了问题。代码应该是读取一个二进制文件并将其转换成我可以用来绘制图的东西 我遇到问题的MatLab代码如下: %reopen the data file using the correct HIFIRST/LOFIRST format if COMM_ORDER==0 fid=fopen(fn,'r','ieee-be'); %HIFIRST else fid=fopen(fn,'r','ieee-le');
%reopen the data file using the correct HIFIRST/LOFIRST format
if COMM_ORDER==0
fid=fopen(fn,'r','ieee-be'); %HIFIRST
else
fid=fopen(fn,'r','ieee-le'); %LOFIRST
end;
这不是我最初的代码,所以我很难知道在Python中该做什么,而且我还无法使用Google找到答案(shocker,对吧?)
可能是我理解错了,但我认为它只是希望重新格式化文件的结尾,而不是实际读取文件本身。稍后我使用fid.seek()和a.fromfile()(其中a=array.array('h'或'b'或'l'或'd'))从文件而不是数据数组中提取
MatLab fread:
function b=ReadByte(fid, Addr)
fseek(fid,Addr,'bof');
b=fread(fid,1,'int8');
function w=ReadWord(fid, Addr)
fseek(fid,Addr,'bof');
w=fread(fid,1,'int16');
以此类推:
function d=ReadDouble(fid, Addr)
fseek(fid,Addr,'bof');
d=fread(fid,1,'float64');
这些函数已通过以下方式转换为python:
def ReadByte(fid, Addr):
fid.seek(Addr,0)
a=array.array('b')
a.fromfile(fid,1)
b=a[0]
return b
def ReadWord(fid, Addr):
fid.seek(Addr,0)
a=array.array('h')
a.fromfile(fid,1)
w=a[0]
return w
具体到:
def ReadDouble(fid, Addr):
fid.seek(Addr,0)
a=array.array('d')
a.fromfile(fid,1)
d=a[0]
return d
像我已经做的那样,只继续处理文件会更好吗?或者我应该尝试将代码更改为使用数组,而不是从文件中?我在这里不知所措。经过几天的挖掘,我找到了一个类似的代码来做我想做的事情,并将其作为示例。可以找到代码。这不会更改endianness,它指定读取文件时使用的endianness<代码>fid可能稍后用于读取文件。不清楚从这些文件中读取与数组有什么关系。fid在fid.seek()中使用,然后以8位、16位等增量将二进制文件作为整数读取到数组中。然后使用该数组绘制数据图。这能让它更清晰吗?你必须在文件打开后显示Matlab代码行,在那里你有实际的
fread
指令,并将其放到你的帖子中。从注释来看,您似乎必须读取16位(2字节)的值,但我们确实需要查看相关的代码行才能确定。@Hoki,像这样吗?(上面编辑)是的,至少我们知道你有时必须读取多字节值。在Matlab中打开文件时的be
或le
设置不会改变文件本身的任何内容,它只是告诉计算机如何执行每个fread
操作。我对Python的知识太贫乏,无法回答,但我建议您将问题标题改为“如何以Python的大端或低端格式读取文件”,或类似的内容。