文件读取意外到达文件末尾

时间:2013-07-30 17:01:05

标签: python python-2.7 file-io

我正在从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能够从文件中读取更大的数据集。有没有人对这个错误发生的原因有所了解?

1 个答案:

答案 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和其他几种语言不同。