246

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.

Bart
  • 10,873
  • 7
  • 29
  • 23
  • 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? – Aaron McDaid Dec 04 '14 at 13:31

15 Answers15

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

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
Federico A. Ramponi
  • 46,145
  • 29
  • 109
  • 133
  • 63
    You can `from __future__ import print_function` in Python 2.6 – jfs Nov 02 '08 at 18:10
  • 14
    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. – James Jan 14 '14 at 17:57
  • Also handy, if you need to overwrite the last line, use ```end='\r'``` – Mircea Nov 14 '19 at 18:17
202
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.

Boris Verkhovskiy
  • 14,854
  • 11
  • 100
  • 103
Greg Hewgill
  • 951,095
  • 183
  • 1,149
  • 1,285
  • 23
    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. – Nathan Garabedian May 08 '12 at 21:56
  • 6
    If typing is an issue, don't forget you can do: log = sys.stdout.write – Andy Chase Jul 27 '12 at 23:27
  • 5
    To use this, you have to import `sys` by using `import sys` – Donald Duck Feb 18 '17 at 19:49
  • As a variation on this idiom: `prynt = lambda x : sys.stdout.write (str(x))` – Rhubbarb Oct 03 '17 at 09:36
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)
Dan
  • 4,855
  • 3
  • 25
  • 21
27

Or use a +, i.e.:

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

Just make sure all are concatenate-able objects.

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.

tzot
  • 92,761
  • 29
  • 141
  • 204
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.

Brian
  • 116,865
  • 28
  • 107
  • 112
  • according to [documentation](https://docs.python.org/2/library/stdtypes.html#file.softspace) **This attribute is not used to control the print statement, but to allow the implementation of print to keep track of its internal state.** – kmad1729 Sep 12 '16 at 19:17
13

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

    print 'h',
    print '\bm'
Abd
  • 147
  • 1
  • 2
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, ...).

John Machin
  • 81,303
  • 11
  • 141
  • 189
  • 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... – Dacav Nov 26 '14 at 08:56
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.

joker
  • 3,416
  • 2
  • 34
  • 37
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.

Benjamin
  • 3,217
  • 2
  • 27
  • 42
1

You can use print like the printf function in C.

e.g.

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

  • 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. – Jonathan Sep 10 '15 at 13:49
1
print("{0}{1}{2}".format(a, b, c))
Michael Murphy
  • 1,921
  • 2
  • 18
  • 21
  • 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. – Jonathan Sep 10 '15 at 13:50
  • … but it is a good idea to have a read of the format documentation: [string — § Format String Syntax](https://docs.python.org/2/library/string.html#format-string-syntax) and [Built-in Types — § String Methods — str.format](https://docs.python.org/2/library/stdtypes.html#str.format) – Rhubbarb Oct 03 '17 at 09:49
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.

Aaron McDaid
  • 26,501
  • 9
  • 66
  • 88
0
print('''first line \
second line''')

it will produce

first line second line

ahmed khattab
  • 2,311
  • 3
  • 16
  • 30
-1
import sys
a=raw_input()
for i in range(0,len(a)):
       sys.stdout.write(a[i])
Mrinal
  • 131
  • 2