Extract data from ASCII file

Mike C. Fletcher mcfletch at rogers.com
Mon Feb 23 13:55:11 EST 2004


Ren wrote:

>What is 'prefix' used for? I searched the docs and didn't come up with
>anything that seemed appropriated.
>  
>
It's just the name (variable) I used to store the "prefix" of the rest 
of the line.  It could just as easily have been called "vlad", but using 
simple, descriptive names for variables makes the code easier to read 
(in most cases, this being the obvious counter-example).  In Python when 
you assign to something:

    x, y = v, t

you are creating a (possibly new) bound name (if something of the same 
name exists in a higher namespace it is shadowed by this bound name, so 
even if there was a built-in function called "prefix" my assignment to 
the name would have shadowed the name).

This line here says:

    prefix, line = line[:4],line[4:]

that is, assign the name "prefix" to the result of slicing the line from 
the starting index to index 4, and assign the name "line" to the result 
of slicing from index 4 to the ending index.  Under the covers the 
right-hand-side of the expression is creating a two-element tuple, then 
that tuple is unpacked to assign it's elements to the two variables on 
the left-hand-side.

Python is a fairly small language, if a linguistic construct works a 
particular way in one context it *normally* works that way in every 
context (unless the programmer explicitly changes that (and that's 
generally *only* done by meta-programmers seeking to create 
domain-specific functionality, and even then as a matter of style, it's 
kept to a minimum to avoid confusing people (and in this particular 
case, AFAIK there's no way to override variable assignment (though (evil 
;) ) people have proposed adding such a hook on numerous occasions)))).

The later line is simply manipulating the (string) object now referred 
to as "prefix":

    result.append( prefix[2:]+prefix[:2] )

that is, take the result of slicing from index 2 to the end and add it 
to the result of slicing from the start to index 2.  This has the effect 
of reversing the order of the 2-byte hexadecimal encodings of "characters".

Oh, and since someone took issue with my use of (new in Python 2.2) 
yield (luddites :) ;) ), here's a non-generator version using the same 
basic code pattern:

 >>> def splitter( line ):
...     line = line[9:] # skip prefix
...     result = []
...     while line:
...         prefix, line = line[:4],line[4:]
...         result.append( prefix[2:]+prefix[:2] )
...     return result
...   
 >>> splitter( ':10000000E7280530AC00A530AD00AD0B0528AC0BE2')
['28E7', '3005', '00AC', '30A5', '00AD', '0BAD', '2805', '0BAC', 'E2']

Have fun :) ,
Mike

_______________________________________
  Mike C. Fletcher
  Designer, VR Plumber, Coder
  http://members.rogers.com/mcfletch/






More information about the Python-list mailing list