How do I write output in same place on the console?
Solution 1
You can also use the carriage return:
sys.stdout.write("Download progress: %d%% \r" % (progress) )
sys.stdout.flush()
Solution 2
Python 2
I like the following:
print 'Downloading File FooFile.txt [%d%%]\r'%i,
Demo:
import time
for i in range(100):
time.sleep(0.1)
print 'Downloading File FooFile.txt [%d%%]\r'%i,
Python 3
print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Demo:
import time
for i in range(100):
time.sleep(0.1)
print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
PyCharm Debugger Console with Python 3
# On PyCharm Debugger console, \r needs to come before the text.
# Otherwise, the text may not appear at all, or appear inconsistently.
# tested on PyCharm 2019.3, Python 3.6
import time
print('Start.')
for i in range(100):
time.sleep(0.02)
print('\rDownloading File FooFile.txt [%d%%]'%i, end="")
print('\nDone.')
Solution 3
Use a terminal-handling library like the curses module:
The curses module provides an interface to the curses library, the de-facto standard for portable advanced terminal handling.
Solution 4
Print the backspace character \b
several times, and then overwrite the old number with the new number.
Solution 5
For Python 3xx:
import time
for i in range(10):
time.sleep(0.2)
print ("\r Loading... {}".format(i)+str(i), end="")
Related videos on Youtube
scottm
Software engineer with skills in highly available systems and software solutions.
Updated on June 21, 2021Comments
-
scottm about 3 years
I am new to python and am writing some scripts to automate downloading files from FTP servers, etc. I want to show the progress of the download, but I want it to stay in the same position, such as:
output:
Downloading File FooFile.txt [47%]
I'm trying to avoid something like this:
Downloading File FooFile.txt [47%] Downloading File FooFile.txt [48%] Downloading File FooFile.txt [49%]
How should I go about doing this?
Duplicate: How can I print over the current line in a command line application?
-
wim almost 13 yearsyou might be interested in this easy-to-use module, it's a text progress bar. pypi.python.org/pypi/progressbar/2.2
-
-
Chris Ballance over 15 yearsinteresting, I hadn't thought of doing it that way.
-
ephemient over 15 yearsVery common and simple solution. Note: if your line is longer than the width of your terminal, this gets ugly.
-
scottm over 15 yearsI also had to add a call to sys.stdout.flush() so the cursor didn't bounce around
-
Diego Herranz about 11 yearsNot available for Windows.
-
Nathan Donnellan about 11 yearsI like this because it doesn't clear previous commands (if you have multiple stages you want to leave on the screen)
-
Plexico over 10 years@Diego there's now a support library for curses module on Windows. see stackoverflow.com/a/19851287/1426237
-
cod3monk3y over 10 yearsUsing carriage return (e.g.
print 'Downloading.... \r'
) also doesn't clear previous data, but it prevents having to know how far back to back up. -
EarlCrapstone about 10 yearsIs it possible to do this with multiple lines? Lets say I have three different downloads, and I want to show the progress of each one on its own line.
-
hkoosha about 10 yearsuse this for python 3+: print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
-
augurar over 9 yearsI like to put the
\r
at the beginning of the line, and add a\x1b[K
to clear the previous text. -
Ogen about 8 yearsWhat if I have multiple lines? For example, multiple downloads happening at the same time. It doesn't seem to work when I just add newlines, it prints infinitely. I.e.,
sys.stdout.write("Download progress: %d%% \n\r" % (progress) )
doesnt work -
Joshua Grosso Reinstate CMs over 7 yearsWhy is this better than the above (I'm a Python n00b, so please excuse my ignorance :-))?
-
PM 2Ring over 6 yearsIn modern Python, you can supply an arg of
flush=True
toprint
, so there's no need for the extrasys.stdout.flush()
call. -
Cyrus over 6 yearsIt seems like the simplest solution for python 3 (as mentioned in answers below) is:
print("sample text", end='\r", flush=True)
-
Yul Kang over 4 yearsOn PyCharm Debugger console, \r needs to come before the text. Otherwise, the text may not appear at all, or appear inconsistently. I added the version that works for me as an edit, because I couldn't write multi-line code in this answer. I put it on my gist so people can view it while the edit is awaiting approval: gist.github.com/yulkang/40168c7729a7a7b96d0116d8b1bc26df
-
battey about 4 years"\r" at the end of the string works for me in the debugger console on PyCharm 2020.1 (PyCharm 2020.1.2 (Community Edition); Build #PC-201.7846.77, built on May 31, 2020).
-
codesnerd over 3 years@Cyrus that worked seamlessly. Just fix the quotes with
\r
:) -
Dave about 3 yearsFirst example has "sys.sdtout" gives a syntax error. Change to "sys.stdout".