在Python中从文件中提取所需字节

0 投票
1 回答
685 浏览
提问于 2025-04-18 17:54

我这里有一个二进制文件:

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

但是没有成功,我的想法哪里出错了?

1 个回答

0

使用一个硬编码的偏移量是一种比较脆弱的解决方案。不过,如果你知道自己在做什么的话:

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

据我所知,这样会导致需要读取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]

如果这不是你预期的结果,可能是你遇到了字节序的问题。

Numpy支持自定义类型来解决这个问题:

比如说:

  • np.dtype('<i4')表示4字节(有符号)整数,小端格式
  • np.dtype('>i4')表示4字节(有符号)整数,大端格式

在你的情况下,如果想强制以小端格式读取数据,你可以这样写:

dt = np.dtype('<i4')

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

撰写回答