无法获取结构以读取整个二进制文件。

我成功地提取了所有头信息,然后只提取了数据的一部分。数据段是123,410个双精度数,但是在检索到62个数字之后,我不能再深入了,struct.unpack指示字符串参数的长度错误。我设置了一个循环,一次获取一个数字,但它在相同的位置停止。该文件未损坏,将在原始软件中打开。有没有人有解决这个问题的建议?

选择 | 换行 | 行号
  1. import struct, string, os
  2.  
  3. bf = "F:/Junker/TestT/TU_TSA.grd"
  4. wbf = open(bf).read()  # "rb")
  5. start, stop = 0, struct.calcsize('<7l8d2l')
  6.  
  7. #Retrieve the header information
  8. try:
  9.     TheadID,TheadSize,HSver,TgridID,TgridSize,nRow,nCol,xLL,yLL,xSize,ySize,zMin,zMax,\
  10.     Rotation,BlankVal,TdataID,TdataSize = struct.unpack('<7l8d2l', wbf[start:stop])
  11. except:
  12.     print "Problem reading Header"
  13. print "TheadID ", TheadID, "\n ", "TheadSize ",TheadSize,"\n ","HSver ", HSver,"\n ","TheadID ",TgridID,"\n ","TgridSize ",TgridSize,"\n ","nRow ",nRow,"\n ","nCol ",nCol,"\n ","xLL ",xLL,"\n ","yLL ",yLL,"\n ","xSize ",xSize,"\n ","ySize ",ySize,"\n ","zMin ",zMin,"\n ","zMax ",zMax,"\n ","Rotation ",Rotation,"\n ","BlankVal ",BlankVal,"\n ","TdataID ",TdataID,"\n ","TdataSize",TdataSize
  14.  
  15. #Retrieve the data
  16. try:
  17.     x = nCol * nRow
  18.     while x:
  19.         start, stop = stop, stop + struct.calcsize('<d')
  20.         DataBlock = struct.unpack('<d', wbf[start:stop])
  21.         print DataBlock, " start ",start, " stop ",stop
  22.  
  23. except:
  24.     print "Failed at: start ",start, " stop ",stop
  25.  
  26. del TheadID,TheadSize,HSver,TgridID,TgridSize,nRow,nCol,xLL,yLL,xSize,ySize,zMin,zMax,\
  27.     Rotation,BlankVal,TdataID,TdataSize,start,stop
  28.  
# 回答1


测试"WBF"的长度,看看它是否与文件大小大致相同。此外,它不是以二进制模式读取的:

选择 | 换行 | 行号
  1. ##  should be
  2. wbf = open(bf, "rb").read()  # "rb") 
# 回答2


这太尴尬了,我更改了太多次,尝试了太多东西,以至于在某个时候我注释掉了读取二进制模式,再也没有把它放回去。啊呀。
谢谢你指出我离得太近而看不到的东西。
# 回答3


答案通常在你知道之后,简单得令人尴尬。

标签: python

添加新评论