0

我正在从 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 能够从文件中读取更大的数据集。有没有人知道为什么会发生这个错误?

4

1 回答 1

0

在我自己的测试中,文件是否以二进制模式打开(令人惊讶)并不重要。我唯一能建议的是确保您完全理解输入文件的格式。因此,除了阅读 matlab 脚本之外,查看文件的十六进制转储可能是一个好主意,您可以在其中看到原始数据的各个字节,并能够验证它是否符合您对其内容布局的理解。

除此之外,您可以尝试对您的readi()函数进行以下简化/优化,它不需要临时x列表并通过一次调用读取组中所有整数的字节file.read()

def readi(f, n):
    fmt = '%di' % n
    return struct.unpack(fmt, f.read(struct.calcsize(fmt)))

但是我认为它不会解决您的问题,因为它应该等同于您已经在做的事情,无论如何都返回值(它不会像您那样打印任何东西)。

最后一点——你不需要用分号结束你的代码行。在这方面,Python 不像 C 和其他几种语言。

于 2013-07-30T20:01:45.840 回答