How to stop print printing spaces?
Roel Schroeven
rschroev_nospam_ml at fastmail.fm
Sat Jul 28 18:57:01 EDT 2007
CC schreef:
> Hi:
>
> I've conjured up the idea of building a hex line editor as a first real
> Python programming exercise.
>
> To begin figuring out how to display a line of data as two-digit hex
> bytes, I created a hunk of data then printed it:
>
> ln = '\x00\x01\xFF 456789abcdef'
> for i in range(0,15):
> print '%.2X ' % ord(ln[i]),
>
> This prints:
> 00 01 FF 20 34 35 36 37 38 39 61 62 63 64 65
>
> because print adds a space after each invocation.
>
> I only want one space, which I get if I omit the space in the format
> string above. But this is annoying, since print is doing more than what
> I tell it to do.
>
> What if I wanted no spaces at all? Then I'd have to do something
> obnoxious like:
>
> for i in range(0,15):
> print '\x08%.2X' % ord(ln[i]),
>
> This works:
>
> import sys
> for i in range(0,15):
> sys.stdout.write( '%.2X' % ord(ln[i]) )
>
> print
>
>
> Is that the best way, to work directly on the stdout stream?
It's not a bad idea: print is mostly designed to be used in interactive
mode and for quick and dirty logging; not really for normal program
output (though I often use it for that purpose).
There is another way: construct the full output string before printing
it. You can do that efficiently using a list comprehension and the
string method join():
>>> print ''.join(['%.2X' % ord(c) for c in ln])
0001FF20343536373839616263646566
In Python 2.4 and higher, you can use a generator expression instead of
a list comprehension:
>>> print ''.join('%.2X' % ord(c) for c in ln)
0001FF20343536373839616263646566
BTW, in your examples it's more pythonic not to use range with an index
variable in the for-loop; you can loop directly over the contents of ln
like this:
import sys
for c in ln:
sys.stdout.write('%.2X' % ord(c))
print
--
If I have been able to see further, it was only because I stood
on the shoulders of giants. -- Isaac Newton
Roel Schroeven
More information about the Python-list
mailing list