Parsing ascii file

Peter Otten __peter__ at web.de
Thu Jun 17 03:42:54 EDT 2004


diablo wrote:

> Hello ,
> 
> I have a file that contains the following data (example) and does NOT have
> any line feeds:
> 
> 11    22    33    44    55    66    77    88    99    00    aa    bb    cc
> dd  ....to 128th byte     11    22    33    44    55    66    77    88   
> 99
> 00    aa    bb    cc    dd .... and so on
> 
> record 1 starts at 0 and finishes at 128, record 2 starts at 129 and
> finishes at 256 and so on. there can be as many as 5000 record per file. I
> would like to parse the file and retreive the value at field at byte 64-65
> and conduct an arithmetical operation on the field (sum them all up).
> 
> Can I do this with python?
> 
> if I was to use awk it would look something like this :
> 
> cat <filename> | fold -w 128 | awk ' { SUM=SUM + substr($0,64,2) } END
> {print SUM}'

Is it an ascii or a binary file? I'm not entire sure from your description.
In the following I assume binary data, but it should be easy to modify the
value() function if those two bytes are ascii digits.

import struct, sys
from itertools import imap

def fold(instream, width=80):
    while 1:
        line = instream.read(width)
        if not line: break
        yield line

def value(line, start=64): # may be an "off by one" bug
    # return int(line[start:start+2]))
    return struct.unpack("h", line[start:start+2])[0]

if __name__ == "__main__":
    try:
        filename = sys.argv[1]
    except IndexError:
        instream = sys.stdin
    else:
        instream = file(filename)

    print sum(imap(value, fold(instream, 128)))

Peter




More information about the Python-list mailing list