How do I keep Python print from adding newlines or spaces?
Question:
In python, if I say
print 'h'
I get the letter h and a newline. If I say
print 'h',
I get the letter h and no newline. If I say
print 'h',
print 'm',
I get the letter h, a space, and the letter m. How can I prevent Python from printing the space?
The print statements are different iterations of the same loop so I can’t just use the + operator.
Answers:
import sys
sys.stdout.write('h')
sys.stdout.flush()
sys.stdout.write('m')
sys.stdout.flush()
You need to call sys.stdout.flush()
because otherwise it will hold the text in a buffer and you won’t see it.
In Python 3, use
print('h', end='')
to suppress the endline terminator, and
print('a', 'b', 'c', sep='')
to suppress the whitespace separator between items. See the documentation for print
Greg is right– you can use sys.stdout.write
Perhaps, though, you should consider refactoring your algorithm to accumulate a list of <whatevers> and then
lst = ['h', 'm']
print "".join(lst)
Python 2.5.2 (r252:60911, Sep 27 2008, 07:03:14)
[GCC 4.3.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print "hello",; print "there"
hello there
>>> print "hello",; sys.stdout.softspace=False; print "there"
hellothere
But really, you should use sys.stdout.write
directly.
For completeness, one other way is to clear the softspace value after performing the write.
import sys
print "hello",
sys.stdout.softspace=0
print "world",
print "!"
prints helloworld !
Using stdout.write() is probably more convenient for most cases though.
Or use a +
, i.e.:
>>> print 'me'+'no'+'likee'+'spacees'+'pls'
menolikeespaceespls
Just make sure all are concatenate-able objects.
Regain control of your console! Simply:
from __past__ import printf
where __past__.py
contains:
import sys
def printf(fmt, *varargs):
sys.stdout.write(fmt % varargs)
then:
>>> printf("Hello, world!n")
Hello, world!
>>> printf("%d %d %dn", 0, 1, 42)
0 1 42
>>> printf('a'); printf('b'); printf('c'); printf('n')
abc
>>>
Bonus extra: If you don’t like print >> f, ...
, you can extending this caper to fprintf(f, …).
This may look stupid, but seems to be the simplest:
print 'h',
print 'bm'
You can use print like the printf function in C.
e.g.
print “%s%s” % (x, y)
In python 2.6:
>>> print 'h','m','h'
h m h
>>> from __future__ import print_function
>>> print('h',end='')
h>>> print('h',end='');print('m',end='');print('h',end='')
hmh>>>
>>> print('h','m','h',sep='');
hmh
>>>
So using print_function from __future__ you can set explicitly the sep and end parameteres of print function.
print("{0}{1}{2}".format(a, b, c))
I am not adding a new answer. I am just putting the best marked answer in a better format.
I can see that the best answer by rating is using sys.stdout.write(someString)
. You can try this out:
import sys
Print = sys.stdout.write
Print("Hello")
Print("World")
will yield:
HelloWorld
That is all.
sys.stdout.write
is (in Python 2) the only robust solution. Python 2 printing is insane. Consider this code:
print "a",
print "b",
This will print a b
, leading you to suspect that it is printing a trailing space. But this is not correct. Try this instead:
print "a",
sys.stdout.write("0")
print "b",
This will print a0b
. How do you explain that? Where have the spaces gone?
I still can’t quite make out what’s really going on here. Could somebody look over my best guess:
My attempt at deducing the rules when you have a trailing ,
on your print
:
First, let’s assume that print ,
(in Python 2) doesn’t print any whitespace (spaces nor newlines).
Python 2 does, however, pay attention to how you are printing – are you using print
, or sys.stdout.write
, or something else? If you make two consecutive calls to print
, then Python will insist on putting in a space in between the two.
import sys
a=raw_input()
for i in range(0,len(a)):
sys.stdout.write(a[i])
print('''first line
second line''')
it will produce
first line second line
In python, if I say
print 'h'
I get the letter h and a newline. If I say
print 'h',
I get the letter h and no newline. If I say
print 'h',
print 'm',
I get the letter h, a space, and the letter m. How can I prevent Python from printing the space?
The print statements are different iterations of the same loop so I can’t just use the + operator.
import sys
sys.stdout.write('h')
sys.stdout.flush()
sys.stdout.write('m')
sys.stdout.flush()
You need to call sys.stdout.flush()
because otherwise it will hold the text in a buffer and you won’t see it.
In Python 3, use
print('h', end='')
to suppress the endline terminator, and
print('a', 'b', 'c', sep='')
to suppress the whitespace separator between items. See the documentation for print
Greg is right– you can use sys.stdout.write
Perhaps, though, you should consider refactoring your algorithm to accumulate a list of <whatevers> and then
lst = ['h', 'm']
print "".join(lst)
Python 2.5.2 (r252:60911, Sep 27 2008, 07:03:14)
[GCC 4.3.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print "hello",; print "there"
hello there
>>> print "hello",; sys.stdout.softspace=False; print "there"
hellothere
But really, you should use sys.stdout.write
directly.
For completeness, one other way is to clear the softspace value after performing the write.
import sys
print "hello",
sys.stdout.softspace=0
print "world",
print "!"
prints helloworld !
Using stdout.write() is probably more convenient for most cases though.
Or use a +
, i.e.:
>>> print 'me'+'no'+'likee'+'spacees'+'pls'
menolikeespaceespls
Just make sure all are concatenate-able objects.
Regain control of your console! Simply:
from __past__ import printf
where __past__.py
contains:
import sys
def printf(fmt, *varargs):
sys.stdout.write(fmt % varargs)
then:
>>> printf("Hello, world!n")
Hello, world!
>>> printf("%d %d %dn", 0, 1, 42)
0 1 42
>>> printf('a'); printf('b'); printf('c'); printf('n')
abc
>>>
Bonus extra: If you don’t like print >> f, ...
, you can extending this caper to fprintf(f, …).
This may look stupid, but seems to be the simplest:
print 'h',
print 'bm'
You can use print like the printf function in C.
e.g.
print “%s%s” % (x, y)
In python 2.6:
>>> print 'h','m','h'
h m h
>>> from __future__ import print_function
>>> print('h',end='')
h>>> print('h',end='');print('m',end='');print('h',end='')
hmh>>>
>>> print('h','m','h',sep='');
hmh
>>>
So using print_function from __future__ you can set explicitly the sep and end parameteres of print function.
print("{0}{1}{2}".format(a, b, c))
I am not adding a new answer. I am just putting the best marked answer in a better format.
I can see that the best answer by rating is using sys.stdout.write(someString)
. You can try this out:
import sys
Print = sys.stdout.write
Print("Hello")
Print("World")
will yield:
HelloWorld
That is all.
sys.stdout.write
is (in Python 2) the only robust solution. Python 2 printing is insane. Consider this code:
print "a",
print "b",
This will print a b
, leading you to suspect that it is printing a trailing space. But this is not correct. Try this instead:
print "a",
sys.stdout.write("0")
print "b",
This will print a0b
. How do you explain that? Where have the spaces gone?
I still can’t quite make out what’s really going on here. Could somebody look over my best guess:
My attempt at deducing the rules when you have a trailing ,
on your print
:
First, let’s assume that print ,
(in Python 2) doesn’t print any whitespace (spaces nor newlines).
Python 2 does, however, pay attention to how you are printing – are you using print
, or sys.stdout.write
, or something else? If you make two consecutive calls to print
, then Python will insist on putting in a space in between the two.
import sys
a=raw_input()
for i in range(0,len(a)):
sys.stdout.write(a[i])
print('''first line
second line''')
it will produce
first line second line