在python中读取二进制文件

时间:2013-08-21 13:58:39

标签: python binary

我有一个二进制文件,我想用python阅读。我知道前493个字节是x值,接下来的87个字节是y值,最后147个字节是z值。我已经编写了一些应该执行此操作的代码,如下所示:

with open("file", "rb") as fileHandle:
    byte = fileHandle.read(1)

    datax = []
    datay = []
    dataz = []

    dim_x = 493
    dim_y = 87
    dim_z = 147

    while fileHandle.tell() < dim_x + dim_y + dim_z:
        byte = fileHandle.read(1)

        if fileHandle.tell() < dim_x:
            datax.append(byte)

        if dim_x < fileHandle.tell() < dim_x + dim_y:
            datay.append(byte)

        if dim_x + dim_y < fileHandle.tell() < dim_x + dim_y + dim_z:
            dataz.append(byte)

    print fileHandle.tell()
    print len(fileHandle.read())

但是,当我比较fileHandle.tell()len(fileHandle.read())时,分别得到727和6304250。这必须意味着我只获得了部分数据?我以为fileHandle.read(1)会逐字节地遍历文件?我在这里缺少什么?

另外,如何在Python中以简单的轮廓图绘制这些数据? matplotlib是要走的路吗?

2 个答案:

答案 0 :(得分:0)

首先,使初始比较不严格,即:

if dim_x <= fileHandle.tell() < dim_x + dim_y:

第二件事:你的文件显然有727 + 6304250字节。最后一次读取调用返回您尚未读取的所有剩余字节。是的,您只获得了部分数据,因为您只请求了前727个字节。

但是,有更多有效和pythonic方法可以做到这一点。

答案 1 :(得分:0)

[我只是Python的初学者,所以我可能误解了一些事情。]

我可以看到这个程序有一些问题,也许可以解释你看到的数字。

  1. 文件的第一个字节由程序的第二行读取,因此不会保存为X值。您应该删除该行。

  2. 当tell()的值为493或580时,if语句不执行任何操作。您需要几个&lt; =。像这样的东西会抓住它们:

  3.     if fileHandle.tell() < dim_x:
            datax.append(byte)
    
        if dim_x <= fileHandle.tell() < dim_x + dim_y:
            datay.append(byte)
    
        if dim_x + dim_y <= fileHandle.tell() < dim_x + dim_y + dim_z:
            dataz.append(byte)
    
    1. 如果您的文件长度恰好是493 + 87 + 147 = 727字​​节,那么实际上您将读取超出文件末尾的三个字节。我不确定当你那样做会发生什么。可能是错误信息。

    2. 最后一行实际上是尝试读取文件中剩下的所有内容。所以看起来你的文件比727字节长得多。事实上,我猜它是727 + 6304250 = 6304977字节长。