这是我的二进制文件: ftp://trmmopen.gsfc.nasa.gov/pub/merged/3B42RT/3B42RT.2014010318.7.bin.gz
我尝试按如下方式读取标题行:
fname = '3B42RT.2014010318.7.bin'
with open(fname, 'rb') as fi:
header = np.fromfile(fi,dtype='S',count=2880)
print header
我得到了ValueError:元素是0大小的。 IDL文件说标题行的数量是2880,所以我将计数设置为2880。
ftp://trmmopen.gsfc.nasa.gov/pub/merged/software/read_rt_file.pro
请任何想法。
答案 0 :(得分:2)
代替' S50'什么是更好的方式
请记住StackOverflow 不代码编写服务。也不是论坛:如果您提出的问题得到解答,您应该问另一个问题。
话虽这么说,因为这实际上让我很开心,仔细观察:
00000040 31 34 30 31 30 33 31 38 2e 37 2e 62 69 6e 20 68 |14010318.7.bin h|
00000050 65 61 64 65 72 5f 62 79 74 65 5f 6c 65 6e 67 74 |eader_byte_lengt|
00000060 68 3d 32 38 38 30 20 66 69 6c 65 5f 62 79 74 65 |h=2880 file_byte|
00000070 5f 6c 65 6e 67 74 68 3d 28 63 68 61 72 32 38 38 |_length=(char288|
00000080 30 29 5f 68 65 61 64 65 72 2b 28 69 6e 74 32 29 |0)_header+(int2)|
00000090 78 31 34 34 30 78 34 38 30 78 32 5f 64 61 74 61 |x1440x480x2_data|
000000a0 2b 28 69 6e 74 31 29 78 31 34 34 30 78 34 38 30 |+(int1)x1440x480|
000000b0 5f 64 61 74 61 2b 28 69 6e 74 32 29 78 31 34 34 |_data+(int2)x144|
000000c0 30 78 34 38 30 5f 64 61 74 61 20 6e 6f 6d 69 6e |0x480_data nomin|
如果出现标题长度存储在header_byte_length
标题字段中。这导致了那个小解析器(我让错误处理和#34;美化"由你决定)。
fname = '3B42RT.2014010318.7.bin'
with open(fname,'rb') as fi:
headers = { 'header_byte_length': "999999" }
pos = 0
acc = ""
while pos < int(headers['header_byte_length']):
c = fi.read(1)
pos += 1
if c == ' ':
try:
k,v = acc.split('=')
headers[k] = v
except ValueError:
pass
acc = ''
else:
acc += c
print headers
print "Data starts a offset ",headers['header_byte_length']
fi.seek(int(headers['header_byte_length']))
答案 1 :(得分:0)
我得到了ValueError:元素是0大小。
据我所知,S
说明符是读取固定长度的字符串。你有来提供长度说明符:
header = np.fromfile(fi,dtype='S50',count=2880)
话虽如此,从您的档案转储:
00000000 61 6c 67 6f 72 69 74 68 6d 5f 49 44 3d 33 42 34 |algorithm_ID=3B4|
00000010 32 52 54 20 61 6c 67 6f 72 69 74 68 6d 5f 76 65 |2RT algorithm_ve|
00000020 72 73 69 6f 6e 3d 30 37 2e 30 30 20 67 72 61 6e |rsion=07.00 gran|
[...]
00000480 2e 67 6f 76 20 72 75 6e 5f 6c 61 74 65 6e 63 79 |.gov run_latency|
00000490 3d 4c 41 53 54 20 20 20 20 20 20 20 20 20 20 20 |=LAST |
000004a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
*
00000b40 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000db0 ff ff 83 01 83 01 83 01 83 01 83 01 83 01 83 01 |................|
各种标题是可变长度并由空格('\x20'
)分隔。您可能必须找到另一种方法来解析这些数据。