我有一个二进制文件,我想用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是要走的路吗?
答案 0 :(得分:0)
首先,使初始比较不严格,即:
if dim_x <= fileHandle.tell() < dim_x + dim_y:
第二件事:你的文件显然有727 + 6304250字节。最后一次读取调用返回您尚未读取的所有剩余字节。是的,您只获得了部分数据,因为您只请求了前727个字节。
但是,有更多有效和pythonic方法可以做到这一点。
答案 1 :(得分:0)
[我只是Python的初学者,所以我可能误解了一些事情。]
我可以看到这个程序有一些问题,也许可以解释你看到的数字。
文件的第一个字节由程序的第二行读取,因此不会保存为X值。您应该删除该行。
当tell()的值为493或580时,if语句不执行任何操作。您需要几个&lt; =。像这样的东西会抓住它们:
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)
如果您的文件长度恰好是493 + 87 + 147 = 727字节,那么实际上您将读取超出文件末尾的三个字节。我不确定当你那样做会发生什么。可能是错误信息。
最后一行实际上是尝试读取文件中剩下的所有内容。所以看起来你的文件比727字节长得多。事实上,我猜它是727 + 6304250 = 6304977字节长。