newbie question concerning formatted output

Bengt Richter bokr at oz.net
Wed Nov 30 05:36:59 CET 2005


On Tue, 29 Nov 2005 17:40:08 GMT, Thomas Liesner <t.liesner at creativ-consulting.de> wrote:

>Hello all,
>
>i am having some hard time to format the output of my small script. I am
>opening a file which containes just a very long string of hexdata
>seperated by spaces. Using split() i can split this string into single
>words and print them on stdout. So far so good. But i want to print always
>three of them in a single line and after that a linebreak.
>
>So instead of:
>
>3905
>3009
>0000
>4508
>f504
>0000
>3707
>5a07
>0000
>etc...
>
>i'd like to have:
>
>3905 3009 0000
>4508 f504 0000
>3707 5a07 0000
>etc...
>
>This is the codesnippet i am using:
>
>#!/usr/bin/python
>
>import string
>inp = open("xyplan.nobreaks","r")
>data = inp.read()
>for words in data.split():
>        print words
>inp.close()
>
>Any hints?
>
Using StringIO(""" ... """) in place of open("xyplan.nobreaks","r"),
(BTW, "r" is the default, and can be left out)

 >>> from StringIO import StringIO
 >>> ins = (line.strip() for line in StringIO("""\
 ... 3905
 ... 3009
 ... 0000
 ... 4508
 ... f504
 ... 0000
 ... 3707
 ... 5a07
 ... 0000
 ... """))
 >>> for tup in zip(ins, ins, ins):
 ...     print '%s %s %s' % tup
 ...
 3905 3009 0000
 4508 f504 0000
 3707 5a07 0000

Or if the zip(it, it) grouping idiom is not politically correct, you could use
itertool.izip instead, or groupby with a grouping function that returns changing
constants for each group of three, e.g.,

 >>> from StringIO import StringIO
 >>> ins = (line.strip() for line in StringIO("""\
 ... 3905
 ... 3009
 ... 0000
 ... 4508
 ... f504
 ... 0000
 ... 3707
 ... 5a07
 ... 0000
 ... """))
 >>> import itertools
 >>> for k,g in itertools.groupby(ins, lambda _, c=itertools.count().next: c()//3):
 ...     print '%s %s %s' % tuple(g)
 ...
 3905 3009 0000
 4508 f504 0000
 3707 5a07 0000

Regards,
Bengt Richter



More information about the Python-list mailing list