How to print without a newline or space
Asked Answered
M

29

2435

Consider these examples using print in Python:

>>> for i in range(4): print('.')
.
.
.
.
>>> print('.', '.', '.', '.')
. . . .

Either a newline or a space is added between each value. How can I avoid that, so that the output is .... instead? In other words, how can I "append" strings to the standard output stream?

Meldameldoh answered 29/1, 2009 at 20:58 Comment(4)
For those who search the string formating documentation of python: docs.python.org/library/stdtypes.html#string-formattingTremayne
Looks like a similar question had been asked previously: https://mcmap.net/q/40983/-how-do-i-keep-python-print-from-adding-newlines-or-spaces-duplicate/9325817Photocathode
Bit late to the party, but why not print("." * 10)?Durst
Explanation on how to use sep and end in python print statementMarlonmarlow
S
3295

In Python 3, you can use the sep= and end= parameters of the print function:

To not add a newline to the end of the string:

print('.', end='')

To not add a space between all the function arguments you want to print:

print('a', 'b', 'c', sep='')

You can pass any string to either parameter, and you can use both parameters at the same time.

If you are having trouble with buffering, you can flush the output by adding flush=True keyword argument:

print('.', end='', flush=True)

Python 2.6 and 2.7

From Python 2.6 you can either import the print function from Python 3 using the __future__ module:

from __future__ import print_function

which allows you to use the Python 3 solution above.

However, note that the flush keyword is not available in the version of the print function imported from __future__ in Python 2; it only works in Python 3, more specifically 3.3 and later. In earlier versions you'll still need to flush manually with a call to sys.stdout.flush(). You'll also have to rewrite all other print statements in the file where you do this import.

Or you can use sys.stdout.write()

import sys
sys.stdout.write('.')

You may also need to call

sys.stdout.flush()

to ensure stdout is flushed immediately.

Silin answered 29/1, 2009 at 21:1 Comment(5)
Thanks! In Python 3.6.3, that flush=True is crucial, or else it doesn't work as intended.Pictorial
Can someone explain why would I need to flush and what does it do actually?Beverlee
It's a few months late, but to answer @Beverlee flush empties the buffer and displays the output right now. Without flush you might have your exact text printed eventually, but only when the system gets around to processing the graphics instead of the IO. Flush makes the text visible immediately by "flushing" the cache.Stodgy
If you're having trouble with buffering you can unbuffer all python output with python -u my.py. This is often a good idea if you want to watch progress in real-time.Naumann
I use format strings and do not want a new line between the string and the ?:line = f"{line[6:]}?" Is there also an "end"?Hammon
A
302

For Python 2 and earlier, it should be as simple as described in Re: How does one print without a CR? by Guido van Rossum (paraphrased):

Is it possible to print something, but not automatically have a carriage return appended to it?

Yes, append a comma after the last argument to print. For instance, this loop prints the numbers 0..9 on a line separated by spaces. Note the parameterless "print" that adds the final newline:

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>>
Acentric answered 27/7, 2012 at 10:9 Comment(12)
This is specifically listed in the question as undesirable behavior because of the spacesFuniculate
On the contrary, the answer should be deleted for two reasons: it has undesirable side effects which you can't disable (included extra spaces), and It isn't forward compatible with python 3 (the parenthesis force a conversion to a tuple). I expect these sorts of shoddy constructs from PHP, not Python. So it's best to not ever use this.Newmark
// , This is the simplest way to get it done in Python 2, though, and there is a LOT of one-off code out there for really old OSes. Probably not the best solution, or even recommended. However, one of the great advantages of StackOverflow is that it lets us know what weirdo tricks are out there. KDP, would you include a quick warning at the top about what @Eric Leschinski said? It does make sense, after all.Barbican
@nathanbasanese Simple or not, it has a side effect that the asker explicitly does not want. Downvoted.Avebury
How can I get rid of that space after each N i.e. I want 0123456..Zooid
You didn't answer the question. "How to print without newline or SPACE?" He specifically says without spaces.Ivett
@Ivett print '\b'+str(i),Festoon
@Joe', you are still printing a space. It's just masked by the backspace.Ivett
@Cylindric: often people find questions via google that aren't a perfect match for what they want, but the answer still works for them. Presumably most of the 291 upvotes on this were from people who were fine with a trailing space, unlike the requirements in the question. That's just how SO works, especially for FAQs that come up in many different contexts. It doesn't justify this answer or mean any of that is a good thing, it just explains how we got here and tells us that this answer actually helped (or at least looked good) for a lot of people.Tapping
Probably fair to say that the answer doesn't deserve to be deleted, but it definitely can benefit from having language that calls out its drawbacks, of which there are many.Freddie
The answer is dated and incorrect for Python3. Dowvnote because the author did not update this answer to indicate that it is for legacy code. And the answer is an incomplete solution to the posted problem.Semipalatinsk
Indeed, does not answer the question (still spaces between i's) and does not work in python 3, I tried print(i,) and print(i),, both writes new lines and the second one writes a (None,) between each i's. Edit: just find out right after, works with print(i, end=""), and print in else must have parenthesis, so print().Dysgraphia
V
179

Note: The title of this question used to be something like "How to printf in Python"

Since people may come here looking for it based on the title, Python also supports printf-style substitution:

>>> strings = [ "one", "two", "three" ]
>>>
>>> for i in xrange(3):
...     print "Item %d: %s" % (i, strings[i])
...
Item 0: one
Item 1: two
Item 2: three

And, you can handily multiply string values:

>>> print "." * 10
..........
Ventilator answered 29/1, 2009 at 21:24 Comment(7)
Indeed, it is missing the point. :) Since there was already a great answer to the question I was just elaborating on some related techniques that might prove useful.Ventilator
Based on the title of the question, I believe this answer is more appropriate analog to how one commonly uses printf in C/C++Retail
This answers the title of the question, but not the body. That said, it provided me with what I was looking for. :)Idell
it's not the answer to the questionOrmandy
@Vanuan, I explained in the bottom of my answer that the title of the question changed at some point. :)Ventilator
Is there a way to use the printf style and get no newlines? print "%s, ", % i ... doesn't work. :-/Composed
This answer is not relevant anymore.Encode
U
100

Use the Python 3-style print function for Python 2.6+ (it will also break any existing keyworded print statements in the same file).

# For Python 2 to use the print() function, removing the print keyword
from __future__ import print_function
for x in xrange(10):
    print('.', end='')

To not ruin all your Python 2 print keywords, create a separate printf.py file:

# printf.py

from __future__ import print_function

def printf(str, *args):
    print(str % args, end='')

Then, use it in your file:

from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

More examples showing the printf style:

printf('hello %s', 'world')
printf('%i %f', 10, 3.14)
#hello world10 3.140000
Underbelly answered 21/2, 2011 at 20:50 Comment(0)
P
48

How to print on the same line:

import sys
for i in xrange(0,10):
   sys.stdout.write(".")
   sys.stdout.flush()
Part answered 3/12, 2010 at 17:16 Comment(1)
Real time output of status and still relevant 10+ years later in Python 3 !Kordofan
M
42

The print function in Python 3.x has an optional end parameter that lets you modify the ending character:

print("HELLO", end="")
print("HELLO")

Output:

HELLOHELLO

There's also sep for separator:

print("HELLO", "HELLO", "HELLO", sep="")

Output:

HELLOHELLOHELLO

If you wanted to use this in Python 2.x just add this at the start of your file:

from __future__ import print_function
Medley answered 29/1, 2009 at 21:7 Comment(3)
what does "sep" do?Guajardo
@Guajardo I know that this is old but I have edited the answer nonetheless for more clarity. Check it now.Anarchic
Thanks for the edit. sep will come in handy. So far I used sep.join(list) to concatenate elements of a list with a separator in between - perfect for writing csv-filesGuajardo
S
24

Using functools.partial to create a new function called printf:

>>> import functools

>>> printf = functools.partial(print, end="")

>>> printf("Hello world\n")
Hello world

It is an easy way to wrap a function with default parameters.

Sun answered 17/6, 2015 at 1:55 Comment(1)
I used to want to do that but couldn't because otherfunction = function(1) would just store the result of function(1), not turn otherfunction into a wrapper. Thanks!Anarchic
F
20

In Python 3+, print is a function. When you call

print('Hello, World!')

Python translates it to

print('Hello, World!', end='\n')

You can change end to whatever you want.

print('Hello, World!', end='')
print('Hello, World!', end=' ')
Festschrift answered 9/7, 2016 at 21:22 Comment(0)
A
15

In Python 2.x, you can just add , at the end of the print function, so it won't print on a new line.

Amarette answered 10/7, 2014 at 19:45 Comment(5)
// , This actually made it print out nothing. Don't we need to then add another print statement without an argument at the end, as shown in https://mcmap.net/q/40511/-how-to-print-without-a-newline-or-space? Would you be willing to edit this answer with a reeeally short two or three line example?Barbican
The OP doesn;t want a space appendedEncode
Didn't answer the question. No spaces.Ivett
This no longer works in Python 2.x and only answers half of what the OP wanted. Why 16 upvotes?Anarchic
@TheTechRobo36414519: It was 25 upvotes and 9 downvotes (total of 16). Since then it got one upvote and one downvote (so right now the total is still 16).Korey
T
13

Python 3:

print('.', end='')

Python 2.6+:

from __future__ import print_function # needs to be first statement in file
print('.', end='')

Python <=2.5:

import sys
sys.stdout.write('.')

If extra space is OK after each print, in Python 2:

print '.',

Misleading in Python 2 - avoid:

print('.'), # Avoid this if you want to remain sane
# This makes it look like print is a function, but it is not.
# This is the `,` creating a tuple and the parentheses enclose an expression.
# To see the problem, try:
print('.', 'x'), # This will print `('.', 'x') `
Tinny answered 22/7, 2015 at 17:9 Comment(0)
M
10

In general, there are two ways to do this:

Print without a newline in Python 3.x

Append nothing after the print statement and remove '\n' by using end='', as:

>>> print('hello')
hello  # Appending '\n' automatically
>>> print('world')
world # With previous '\n' world comes down

# The solution is:
>>> print('hello', end='');print(' world'); # End with anything like end='-' or end=" ", but not '\n'
hello world # It seems to be the correct output

Another Example in Loop:

for i in range(1,10):
    print(i, end='.')

Print without a newline in Python 2.x

Adding a trailing comma says: after print, ignore \n.

>>> print "hello",; print" world"
hello world

Another Example in Loop:

for i in range(1,10):
    print "{} .".format(i),

You can visit this link.

Midst answered 20/8, 2018 at 13:35 Comment(7)
What about the space?Ivett
use end=" " e.g.: print('hello', end='' ");print('world')Midst
Your 2.7 solution does not remove the space.Ivett
I mention that remove '\n' not space, space is by default in python2. See what this looks: print 'hello' ;print'there' in paiza.io/projects/e/35So9iUPfMdIORGzJTb2NQMidst
Right, that is why your answer was down-voted. You did not answer the question, "How to print without newline or space?". Your answer for 2.x doesn't answer the question. You answer for 3.0 is the same as many of the other answers that were posted over nine years ago. Simply stated, this answer adds nothing useful to the community and you should delete it.Ivett
I have mentioned that Print without newline in Python 2.x in answer. It does the work as asked in question, i have checked it twice. I think that my answer can be simple one that's why i post it. Anyway thanks for your suggestion. Should i delete it?Midst
You just said "I mention that remove '\n' not space, space is by default in python2. See what this looks: print 'hello' ;print'there'". You just admitted that your code does not answer the question (i.e. your code does not remove the SPACE). Your python 3 example is identical to most of the other answers; it adds nothing new. Yes, you should delete your answer.Ivett
A
9

You can try:

import sys
import time
# Keeps the initial message in buffer.
sys.stdout.write("\rfoobar bar black sheep")
sys.stdout.flush()
# Wait 2 seconds
time.sleep(2)
# Replace the message with a new one.
sys.stdout.write("\r"+'hahahahaaa             ')
sys.stdout.flush()
# Finalize the new message by printing a return carriage.
sys.stdout.write('\n')
Albumose answered 23/11, 2015 at 12:3 Comment(0)
P
9

Just use end=''

for i in range(5):
  print('a',end='')

# aaaaa
Precambrian answered 18/4, 2022 at 7:6 Comment(0)
I
8

just use the end ="" or sep =""

>>> for i in range(10):
        print('.', end = "")

output:

.........
Imperator answered 10/1, 2022 at 6:11 Comment(0)
R
7

I recently had the same problem...

I solved it by doing:

import sys, os

# Reopen standard output with "newline=None".
# in this mode,
# Input:  accepts any newline character, outputs as '\n'
# Output: '\n' converts to os.linesep

sys.stdout = os.fdopen(sys.stdout.fileno(), "w", newline=None)

for i in range(1,10):
    print(i)

This works on both Unix and Windows, but I have not tested it on Mac OS X.

Riesling answered 18/6, 2012 at 3:39 Comment(1)
Breaks sys.__stdout__Encode
C
6

You can do the same in Python 3 as follows:

#!usr/bin/python

i = 0
while i<10 :
    print('.', end='')
    i = i+1

And execute it with python filename.py or python3 filename.py.

Curhan answered 5/7, 2013 at 17:37 Comment(0)
P
5

lenooh satisfied my query. I discovered this article while searching for 'python suppress newline'. I'm using IDLE 3 on Raspberry Pi to develop Python 3.2 for PuTTY.

I wanted to create a progress bar on the PuTTY command line. I didn't want the page scrolling away. I wanted a horizontal line to reassure the user from freaking out that the program hasn't cruncxed to a halt nor been sent to lunch on a merry infinite loop - as a plea to 'leave me be, I'm doing fine, but this may take some time.' interactive message - like a progress bar in text.

The print('Skimming for', search_string, '\b! .001', end='') initializes the message by preparing for the next screen-write, which will print three backspaces as ⌫⌫⌫ rubout and then a period, wiping off '001' and extending the line of periods.

After search_string parrots user input, the \b! trims the exclamation point of my search_string text to back over the space which print() otherwise forces, properly placing the punctuation. That's followed by a space and the first 'dot' of the 'progress bar' which I'm simulating.

Unnecessarily, the message is also then primed with the page number (formatted to a length of three with leading zeros) to take notice from the user that progress is being processed and which will also reflect the count of periods we will later build out to the right.

import sys

page=1
search_string=input('Search for?',)
print('Skimming for', search_string, '\b! .001', end='')
sys.stdout.flush() # the print function with an end='' won't print unless forced
while page:
    # some stuff…
    # search, scrub, and build bulk output list[], count items,
    # set done flag True
    page=page+1 #done flag set in 'some_stuff'
    sys.stdout.write('\b\b\b.'+format(page, '03')) #<-- here's the progress bar meat
    sys.stdout.flush()
    if done: #( flag alternative to break, exit or quit)
        print('\nSorting', item_count, 'items')
        page=0 # exits the 'while page' loop
list.sort()
for item_count in range(0, items)
    print(list[item_count])

#print footers here
if not (len(list)==items):
    print('#error_handler')

The progress bar meat is in the sys.stdout.write('\b\b\b.'+format(page, '03')) line. First, to erase to the left, it backs up the cursor over the three numeric characters with the '\b\b\b' as ⌫⌫⌫ rubout and drops a new period to add to the progress bar length. Then it writes three digits of the page it has progressed to so far. Because sys.stdout.write() waits for a full buffer or the output channel to close, the sys.stdout.flush() forces the immediate write. sys.stdout.flush() is built into the end of print() which is bypassed with print(txt, end='' ). Then the code loops through its mundane time intensive operations while it prints nothing more until it returns here to wipe three digits back, add a period and write three digits again, incremented.

The three digits wiped and rewritten is by no means necessary - it's just a flourish which exemplifies sys.stdout.write() versus print(). You could just as easily prime with a period and forget the three fancy backslash-b ⌫ backspaces (of course not writing formatted page counts as well) by just printing the period bar longer by one each time through - without spaces or newlines using just the sys.stdout.write('.'); sys.stdout.flush() pair.

Please note that the Raspberry Pi IDLE 3 Python shell does not honor the backspace as ⌫ rubout, but instead prints a space, creating an apparent list of fractions instead.

Pater answered 28/2, 2015 at 4:35 Comment(0)
R
5

You want to print something in the for loop right; but you don't want it print in new line every time...

For example:

 for i in range (0,5):
   print "hi"

 OUTPUT:
    hi
    hi
    hi
    hi
    hi

But you want it to print like this: hi hi hi hi hi hi right????

Just add a comma after printing "hi".

Example:

for i in range (0,5):
    print "hi",

OUTPUT:

hi hi hi hi hi
Relieve answered 23/7, 2015 at 14:18 Comment(1)
No, the OP wants hihihihihi, not hi hi hi hi hiDiscount
A
5

Many of these answers seem a little complicated. In Python 3.x you simply do this:

print(<expr>, <expr>, ..., <expr>, end=" ")

The default value of end is "\n". We are simply changing it to a space or you can also use end="" (no space) to do what printf normally does.

Ammamaria answered 24/11, 2015 at 18:46 Comment(0)
B
5

You will notice that all the above answers are correct. But I wanted to make a shortcut to always writing the " end='' " parameter in the end.

You could define a function like

def Print(*args, sep='', end='', file=None, flush=False):
    print(*args, sep=sep, end=end, file=file, flush=flush)

It would accept all the number of parameters. Even it will accept all the other parameters, like file, flush, etc. and with the same name.

Blur answered 9/3, 2017 at 5:54 Comment(1)
It do not run, it complaints that *arg is in beginning (python 2.7), and putting it at the end did run, but did not work completely right. I defined a function that only took Print(*args), and then just called print with sep='', end=''. And now it works as I want. So one upvote for the idea.Warlord
S
3
 for i in range(0, 5): #setting the value of (i) in the range 0 to 5 
     print(i)

The above code gives the following output:

 0    
 1
 2
 3
 4

But if you want to print all these output in a straight line then all you should do is add an attribute called end() to print.

 for i in range(0, 5): #setting the value of (i) in the range 0 to 5 
     print(i, end=" ")

Output:

 0 1 2 3 4

And not just a space, you can also add other endings for your output. For example,

 for i in range(0, 5): #setting the value of (i) in the range 0 to 5 
     print(i, end=", ")

Output:

 0, 1, 2, 3, 4, 

Remember:

 Note: The [for variable in range(int_1, int_2):] always prints till the variable is 1

 less than it's limit. (1 less than int_2)
Suprematism answered 3/7, 2020 at 8:1 Comment(0)
J
2

Or have a function like:

def Print(s):
    return sys.stdout.write(str(s))

Then now:

for i in range(10): # Or `xrange` for the Python 2 version
    Print(i)

Outputs:

0123456789
Jamila answered 17/10, 2018 at 1:41 Comment(0)
R
1
for i in xrange(0,10): print '\b.',

This worked in both 2.7.8 & 2.5.2 (Enthought Canopy and OS X terminal, respectively) -- no module imports or time travel required.

Rosenbaum answered 18/10, 2014 at 20:13 Comment(4)
That prints backspace characters to standard output. It might look correct if standard output happens to be a terminal, but if it's redirected to a file that file will contain control characters.Jaclin
True, but I can't imagine that anyone would want to use this for anything other than a low-tech progress bar ...Rosenbaum
Nevertheless, the Python code does not do the same thing as the C code in the question.Jaclin
you can test with sys.stdout.isatty() if not redirected to a file.Clearstory
H
1

To print without ending a line, you can do this:

print("Hello", end='')

So if you add

print(" Hello again!", end='')

The output will look like this:

Hello Hello again!
Hairline answered 8/6, 2023 at 16:43 Comment(1)
I get "invalid syntax" (Python 2.6)Interlunar
P
0

Python3 :

print('Hello',end='')

Example :

print('Hello',end=' ')
print('world')

Output: Hello world

This method add spearator between provided texts :

print('Hello','world',sep=',')

Output:Hello,world

Pelletier answered 13/12, 2021 at 13:33 Comment(0)
P
0

Here are three codes for you to choose one:

print("".join(["." for i in range(4)]))

or

print("." + "." + "." + ".")

or

print(".", ".", ".", ".", sep="")
Philippopolis answered 28/1, 2023 at 6:22 Comment(0)
M
0

Add end='' to the print function e.g.:

print(i+1, end='')
Marine answered 21/3 at 10:33 Comment(0)
A
-1

The simplest option would be to use as below:

st = {4,5,'c','a',2,'b'}
print(*list(st)," ")
Absorb answered 13/4 at 12:45 Comment(3)
This explicitly prints a trailing space that is not desired. (There's also no reason to pass st to list first; any iterable, including set, can be unpacked with the * syntax.)Wellheeled
set was just an example. Focus should be on the original question i.e. print statement.Absorb
Regarding the original question: "Either a newline or a space is added between each value. How can I avoid that?"Wellheeled
B
-4

You do not need to import any library. Just use the delete character:

BS = u'\0008' # The Unicode point for the "delete" character
for i in range(10):print(BS + "."),

This removes the newline and the space (^_^)*.

Brooch answered 17/5, 2017 at 4:1 Comment(1)
This doesn't "remove" anything; it prints another character, and depends on the display device to render appropriately.Wellheeled

© 2022 - 2024 — McMap. All rights reserved.