1

我有一个二进制文件,我想用 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 是要走的路吗?

4

2 回答 2

0

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

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

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

不过,有许多更有效和 Pythonic 的方法可以做到这一点。

于 2013-08-21T14:10:31.720 回答
0

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

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

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

  2. 当 tell() 的值为 493 或 580 时,您的 if 语句不执行任何操作。您需要几个 <=。这样的事情会抓住他们:

    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 字节。

于 2013-08-21T14:31:01.467 回答