我正在从matlab翻译脚本,它读取二进制编码的32位整数文件并适当地解析它们。我编写了以下方法来模仿matlab的fread()函数:
def readi(f,n):
x = zeros(n,int);
for i in range(0,n):
x[i] = struct.unpack('i',f.read(4))[0];
print x[i];
return x;
当我解析数据时,我在脚本中以1到9之间的n调用此函数。我的问题是,在我收到此错误之前,脚本只会进入文件的一部分:
x[i] = struct.unpack('i',f.read(4))[0];
struct.error: unpack requires a string argument of length 4
看起来python认为我已经到了文件的末尾。发生错误的执行点是循环中已经多次迭代的一行。此外,已经解析的文件的一小部分已经完全匹配我的matlab脚本从完全相同的文件(而不是副本)生成的内容。但是,Matlab能够从文件中读取更大的数据集。有没有人对这个错误发生的原因有所了解?
答案 0 :(得分:0)
在我自己的测试中,文件是否以二进制模式打开(令人惊讶)并不重要。我唯一能建议的是确保您理解输入文件格式完全。因此,除了阅读matlab脚本之外,查看文件的十六进制转储可能是个好主意,您可以在其中查看原始数据的各个字节,并且能够验证它是否与您对其内容布局的理解相符。
除此之外,您可以尝试以下简化/优化readi()
函数,该函数不需要临时x
列表,并通过一次调用读取组中所有整数的字节file.read()
:
def readi(f, n):
fmt = '%di' % n
return struct.unpack(fmt, f.read(struct.calcsize(fmt)))
但是我不认为它会解决你的问题,因为它应该等同于你已经在做的事情,无论如何都要返回价值(它不会像你那样打印)。
最后一点 - 您不需要用分号结束代码行。在这方面,Python与C和其他几种语言不同。