【问题标题】:Extract required bytes from a file in Python在 Python 中从文件中提取所需的字节
【发布时间】:2014-08-20 12:23:23
【问题描述】:

我在这里有一个二进制文件: ftp://n5eil01u.ecs.nsidc.org/SAN/GLAS/GLA06.034/2003.02.21/GLA06_634_1102_001_0079_3_01_0001.DAT

我必须从该文件中提取以下数据:

Byte Offset: 176 
Data type: 4-byte (long) integer
Total bytes: 160

我尝试如下:

import numpy as np    
fname = 'GLA06_634_1102_001_0079_3_01_0001.DAT' 

with open(fname,'rb') as fi:
    fi.seek (176,0)
    data= np.fromfile(fi,dtype='long',count=160)
    print data

没有成功,我的想法有什么问题?

【问题讨论】:

  • 您要在 176 处打印值吗?不清楚你想做什么。
  • 不,我要获取字节偏移量和数据大小指定的实际数据集
  • 176是字节偏移量,之后文件中的偏移量需要的数据存在
  • 你想从文件中得到哪个值?这会容易得多。
  • 这些值是长整数格式,它不是一个,而是一组数字。变量名是 i_lat

标签: python numpy binary scipy


【解决方案1】:

使用 硬编码 偏移是一个相当脆弱 的解决方案。但假设你知道自己在做什么:

Byte Offset: 176 
Data type: 4-byte (long) integer
Total bytes: 160

AKAICT,导致读取 160/4 = 40 个值(您能确认一下吗?)

另外,类型应该是 numpy 定义的类型之一。这里np.int32 可能是正确的:

data= np.fromfile(fi,dtype=np.int32,count=40)

在我的电脑上,这会产生以下结果:

[1919251297  997485633 1634494218 1936678771 1634885475  825124212
  808333629  808464432  942813232 1818692155 1868526433 1918854003
 1600484449 1702125924  842871086  758329392  841822768 1728723760
 1601397100 1600353135 1702125938 1835627615 1026633317  809119792
  808466992 1668483643 1668509535 1952543327 1026633317  960048688
  960051513  909654073  926037812 1668483643 1668509535 1952543327
 1633967973  825124212  808464957  842018099]

如果这不是预期的,可能是endianness 的问题。

Numpy 支持 custom defined types 解决这个问题:

例如:

  • np.dtype('<i4') 是 4 字节(有符号)整数 little endian
  • np.dtype('>i4') 是 4 字节(有符号)整数 big endian

在您的情况下,要强制以小端序读取数据,您可以编写:

dt = np.dtype('<i4')

with open(fname,'rb') as fi:
    fi.seek (176,0)
    data= np.fromfile(fi,dtype=dt,count=40)
    print data

【讨论】:

  • 感谢您的努力。我认为头文件应该在此之前转义
  • 要求的值不仅是40,还有很多
  • “要求的值不仅是 40,而且更多” 所以你的总字节数是错误的。或者有些东西我不理解为“160 字节/4 字节标准值”“40 值”。对于字节顺序,请参阅我的编辑。
  • 文件内的预期数据是15312。
  • They are like this: -50.356519 -50.35806 -50.361143 -50.362686 -50.364229 -50.365772 -50.370389 -50.371925 -64.969675 -64.9712 -64.972726 -64.997073 -64.998594
猜你喜欢
  • 2016-10-04
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
相关资源
最近更新 更多