244

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.

1
  • 4
    My current experiments suggest there is no trailing space. Instead, it is a leading space if and only if the preceding output operation was a print. To see yourself, interleave some calls to print '.', and sys.stdout.write(','). This is crazy. Why should it 'remember' what came before, and change behaviour accordingly? Commented Dec 4, 2014 at 13:31

15 Answers 15

305

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

Sign up to request clarification or add additional context in comments.

3 Comments

You can from __future__ import print_function in Python 2.6
from future import print_function will break any other print statements using the old syntax in the same module, so whilst it's more elegant than sys.stdout.write, it can be more work to make the change.
Also handy, if you need to overwrite the last line, use end='\r'
203
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.

4 Comments

This worked great for me. Just don't forget to do a sys.stdout.flush() when you're ready to display it on screen, otherwise it will hold it in a buffer and you won't see it. I use this to give visual feedback that a script is still running when it's going through a long while or for loop.
If typing is an issue, don't forget you can do: log = sys.stdout.write
To use this, you have to import sys by using import sys
As a variation on this idiom: prynt = lambda x : sys.stdout.write (str(x))
44

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)

1 Comment

as a variation on this idiom: print ''.join(map(str,[1, '+', 2, '=', 3]))
27

Or use a +, i.e.:

>>> print 'me'+'no'+'likee'+'spacees'+'pls'
menolikeespaceespls

Just make sure all are concatenate-able objects.

2 Comments

or, you can convert them: print str(me)+str(no)+str(likee)+str(spacees)+str(pls)
This still adds a newline.
19
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.

Comments

17

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.

1 Comment

according to documentation This attribute is not used to control the print statement, but to allow the implementation of print to keep track of its internal state.
13

This may look stupid, but seems to be the simplest:

    print 'h',
    print '\bm'

1 Comment

This still adds a newline.
8

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 %d\n", 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, ...).

1 Comment

I loved this :D. A good thing about it is that it implicitly kills the problem of "something %s" % x where x is a tuple...
7

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.

Comments

4

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.

Comments

1

You can use print like the printf function in C.

e.g.

print "%s%s" % (x, y)

1 Comment

This still adds a newline afterwards. The OP wanted to call print multiple times over a loop and not have any spaces or newlines in between.
1
print("{0}{1}{2}".format(a, b, c))

2 Comments

This still adds a newline afterwards. The OP wanted to call print multiple times over a loop and not have any spaces or newlines in between.
… but it is a good idea to have a read of the format documentation: string — § Format String Syntax and Built-in Types — § String Methods — str.format
0

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.

Comments

0
print('''first line \
second line''')

it will produce

first line second line

Comments

-1
import sys
a=raw_input()
for i in range(0,len(a)):
       sys.stdout.write(a[i])

1 Comment

The accepted answer by Greg Hewgill already mentioned sys.stdout.write().

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.