读取标题行生成的值错误

时间:2014-08-22 11:39:49

标签: python numpy

这是我的二进制文件: 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

请任何想法。

2 个答案:

答案 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')分隔。您可能必须找到另一种方法来解析这些数据。